0


我在 Netbeans 中有一个 Web 应用程序,我创建了一些 jsp 页面,它们使用方法(我的方法)从类中获取一些数据,例如用户名、标题等。

我还使用 MySQL 将用户存储在一个表中。为了获取用户名(在用户登录后),我使用了 getUsername() 方法。

在我的 jsp 页面中,我有以下代码:

<%UserBean currentUser=(UserBean)(session.getAttribute("currentSessionUser"));%> <h1><%= currentUser.getUsername() %> </h1>

其中 userBean 是一个类等。一切运行顺利,但有时(我注意到当我有一段时间不使用浏览器中的应用程序时会发生这种情况(15-20 分钟?我不知道)我得到一个错误状态

HTTP 状态 500 - java.lang.NullPointerException

并且 Tomcat 中的日志文件打印

org.apache.catalina.core.StandardWrapperValve 调用严重:Servlet.service() for servlet [jsp] in context with path [/APle] throw exception [java.lang.NullPointerException] with root causejava.lang.NullPointerException

at org.apache.jsp.welcome_jsp._jspService(welcome_jsp.java:96)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)

我去检查第 96 行中的文件 welcome_jsp.java,这是我获取用户名的方法。

      out.print( currentUser.getUsername() );

我想我收到错误的原因是该方法返回 Null.. 但是为什么会这样呢?如果我再次部署应用程序,一切都会正常运行!

谢谢!!

4

1 回答 1

1
<%UserBean currentUser=(UserBean)(session.getAttribute("currentSessionUser"));%> 
<h1><%= currentUser.getUsername() %> </h1>

在这里,您从会话中获取“UserBean”对象并直接调用函数。如果您在特定时间内未使用您的 Web 应用程序,您的会话将过期并且如果您调用

<%UserBean currentUser=(UserBean)(session.getAttribute("currentSessionUser"));%> 

这里'currentUser'将为空。所以在那之后你试图访问'currentUser'这将抛出NullPointerException。因此,您应该在从对象获取值之前检查对象的空指针,例如

<%UserBean currentUser=(UserBean)(session.getAttribute("currentSessionUser"));
if(currentUser != null){
%>
<h1><%= currentUser.getUsername() %> </h1>
<%}%>
于 2013-07-24T09:04:43.243 回答