org.apache.catalina.connector.Request.parseParameters(Request.java:2446) NullPointerException異常處理
1、環境
tomcat6.0.8 + jdk6 + struts1
2、問題的產生
頁麵有兩個異常的請求
https://127.0.0.1/project/a.action?do=testA&m=10 https://127.0.0.1/project/a.action?do=testB&m=10
兩個請求幾乎同步到達server。結果出現異常:
java.lang.NullPointerException at org.apache.catalina.connector.Request.parseParameters(Request.java:2446) at org.apache.catalina.connector.Request.getParameter(Request.java:1040) at org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:355) at com.tepper.common.util.JsonUtil.jsonResponse(JsonUtil.java:101) at com.tepper.flow.action.TechnologyFlowAction.loadLinkers(TechnologyFlowAction.java:126) at com.tepper.flow.action.TechnologyFlowAction.judgeRequest(TechnologyFlowAction.java:86) at com.tepper.flow.action.TechnologyFlowAction.execute(TechnologyFlowAction.java:59) at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419) at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224) at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196) at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432) at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at com.tepper.common.SessionFilter.doFilter(SessionFilter.java:76) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at com.tepper.common.ResFilter.doFilter(ResFilter.java:49) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:433) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) at java.lang.Thread.run(Thread.java:619)
或者後台沒異常,前台第一個請求的response返回的是第二個請求的結果。而第二次請求則沒有response。
經調試,發現兩次請求的request對象是同一對象。然後想起Struts1是非線程安全的,而我在代碼中,為了讓一個Action接收多個頁麵的請求,把request對象寫成了全局對象。
3、解決
struts1是非線程安全的。兩個同一時間的異步請求,會得到同一個request對象,兩個請求會造成衝突。
在execution方法中使用局部變量是最簡單的保證線程安全的方法了。也就是說在使用struts1的action時,不要在類中定義屬性。
把全局的request對象,放回execution方法中,變成局部變量,問題得到解決。
最後更新:2017-04-03 12:56:33