2017-08-27 108 views
0

我有一个很奇怪的情况。我打电话给一个hibernate函数来读取数据库中的一个条目,它可以在我称之为的大多数地方使用,但在一个地方,它不起作用,给我NullPointerException。我认为代码中缺少一些非常小的东西,但我不知道它是什么。看看这里:java.lang.NullPointerException在奇怪的情况下

Servlet中,我调用该函数:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     // TODO Auto-generated method stub 
     String dataA = request.getParameter("answers"); 
     String dataQ = request.getParameter("quests"); 
     String user = request.getParameter("usern"); 
     String chap = request.getParameter("chapt"); 

     String[] answers = dataA.split(","); 
     String[] quests = dataQ.split("&"); 


     TestHandler tHandler = new TestHandler(5); 
     UserDAO u=new UserDAO(); 
     UserChapterDAO uc = new UserChapterDAO(); 


     ChapterDAO chdao = new ChapterDAO(); 
     Chapter myCh=chdao.findTChapter(chap+""); 

     response.setContentType("text/html"); 
     PrintWriter out = response.getWriter(); 
     out.println(chap); 
     out.println(myCh.getId()); 

的休眠方法:

@SuppressWarnings("unchecked") 
     public Chapter findTChapter(String title) { 

      List<Chapter> chapter = null; 
      Transaction tx=null; 

       try{ 
        Configuration configuration = new Configuration().configure("hibernate.cfg.xml"); 
        SessionFactory sessionFactory = configuration.buildSessionFactory(); 
        Session session = sessionFactory.openSession(); 
        tx = session.beginTransaction(); 

       Query query = session.createQuery("FROM Chapter WHERE title = :title"); 
       query.setParameter("title", title); 
       chapter = query.list(); 
       tx.commit(); 
      } catch (HibernateException e) { 
       if (tx != null) { 
        tx.rollback(); 
       } 
       LOGGER.error("", e); 
      } 

       return chapter != null && !chapter.isEmpty() ? chapter.get(0) : null; 
     } 

错误跟踪:

SEVERE: Servlet.service() for servlet [TestServlet] in context with path [/HibernateWebApp] threw exception 
java.lang.NullPointerException 
    at controller.TestServlet.doPost(TestServlet.java:76) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:650) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:218) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:962) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1115) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 

servlet映射是以下一个:

<servlet> 
    <display-name>Test</display-name> 
    <servlet-name>TestServlet</servlet-name> 
    <servlet-class>controller.TestServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>TestServlet</servlet-name> 
    <url-pattern>/test</url-pattern> 
    </servlet-mapping> 

和调用这个servlet的JSP部分:

<form class="form-horizontal" action="test" method="POST"> 

         <div class="form-group"> 
         <input type="hidden" id="answers" name="answers"> 
         <input type="hidden" id="quests" name="quests" value="<%out.println(q); %>" > 
         <input type="hidden" id="chatp" name="chapt" value="<%out.println(request.getParameter("chapter")); %>"> 
         <button type="submit" class="btn btn-success btn-md" id="finish" style="display:none;">Finish</button> 

          </div> 
         </form> 

误差在通过out.println apears(myCh.getId()),所以ID实际上并不读取DB一章和存储在myCh对象中。 我提到在其他地方我使用这个,它完美的作品。另外,如果我通过将String chap硬编码到实际的字符串中来调用该函数,它正在工作。而且我也确信String chap完全取自于jsp,因为我使用out.println(chap)进行打印,并且它是必须的。

我真的被困在那里。有任何想法吗?

+0

'章myCh = chdao.findTChapter(CHAP + “”);' 您可以确认是否接收**为'myCh' 如果你能打印'chap'并得到空** **值空** myCh'的值,你需要调试你的'findTChapter'方法。 –

+0

是的,它是空的,我欺骗它 –

+0

所以,'chap'有价值和'findTChapter'返回null? –

回答

0

尝试此查询

Query query = session.createQuery("FROM Chapter c WHERE c.title = :title"); 
+0

它给了我同样的东西:(真的相信没有问题,但休眠功能,因为它在其他情况下工作 –

0

第一件事: String chap = request.getParameter("chapt");

将其更改为: String chap = request.getParameter("chapter");

还请确认您的行动网址是否是形式: http://appurl/test?chapter=abcd

+0

是的,url具有所需章节的形式,并且,更改请求参数是给我同样的结果太奇怪了 –

+0

无论你的异常熄灭时,评论这条线: '“>'?? 像你可以通过给硬编码值测试和确认 –

+0

同样的事情我刚刚删除了那个输入并试图只读取url参数另外,把输入文字作为文本输入,其值也是正确的。 –

0

Typo。你有

String chap = request.getParameter("chapt"); 

<input type="hidden" id="chatp" name="chapt" value="<%out.println(request.getParameter("chapter")); %>"> 

尝试让你的ID和名称和参数名称一致。

+0

它得到了参数正确的哈哈,无论错字:) –