org.apache.catalina.connector.Request.parseParameters(Request.java:2446) NullPointerException异常处理

简介: <h3>1、环境</h3> <p>tomcat6.0.8 + jdk6 + struts1 </p> <p><br></p> <h3>2、问题的产生</h3> <p>页面有两个异常的请求</p> <p></p><pre code_snippet_id="331717" snippet_file_name="blog_20140507_1_7979055" name="code"

1、环境

tomcat6.0.8 + jdk6 + struts1 


2、问题的产生

页面有两个异常的请求

http://127.0.0.1/project/a.action?do=testA&m=10
http://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方法中,变成局部变量,问题得到解决。

目录
相关文章
|
10月前
|
安全 Java 开发者
告别NullPointerException:拥抱Java Optional
告别NullPointerException:拥抱Java Optional
|
9月前
|
安全 Java
Java异常处理:程序世界的“交通规则
Java异常处理:程序世界的“交通规则
404 98
|
10月前
|
安全 Java 开发者
NullPointerException:拥抱Java Optional-6
NullPointerException:拥抱Java Optional
337 104
|
10月前
|
安全 Java 容器
NullPointerException:拥抱Java Optional-5
NullPointerException:拥抱Java Optional
351 107
|
10月前
|
安全 Java 开发者
告别NullPointerException:拥抱Java Optional-4
告别NullPointerException:拥抱Java Optional-4
327 104
|
9月前
|
安全 Java 编译器
驾驭Java异常处理:从新手到专家的优雅之道
驾驭Java异常处理:从新手到专家的优雅之道
366 59
|
Java 编译器 数据库连接
Java异常处理:写出更健壮的代码
Java异常处理:写出更健壮的代码
318 0
|
9月前
|
安全 Java 开发者
告别NullPointerException:掌握Java Optional的精髓
告别NullPointerException:掌握Java Optional的精髓
|
11月前
|
Java 数据库 C++
Java异常处理机制:try-catch、throws与自定义异常
本文深入解析Java异常处理机制,涵盖异常分类、try-catch-finally使用、throw与throws区别、自定义异常及最佳实践,助你写出更健壮、清晰的代码,提升Java编程能力。
|
Java 程序员
Java编程中的异常处理:从基础到高级
在Java的世界中,异常处理是代码健壮性的守护神。本文将带你从异常的基本概念出发,逐步深入到高级用法,探索如何优雅地处理程序中的错误和异常情况。通过实际案例,我们将一起学习如何编写更可靠、更易于维护的Java代码。准备好了吗?让我们一起踏上这段旅程,解锁Java异常处理的秘密!

推荐镜像

更多