我有一个很奇怪的情况。我打电话给一个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)进行打印,并且它是必须的。
我真的被困在那里。有任何想法吗?
'章myCh = chdao.findTChapter(CHAP + “”);' 您可以确认是否接收**为'myCh' 如果你能打印'chap'并得到空** **值空** myCh'的值,你需要调试你的'findTChapter'方法。 –
是的,它是空的,我欺骗它 –
所以,'chap'有价值和'findTChapter'返回null? –