4

我让这段代码在 servlet 中运行

public void doPost(HttpServletRequest request, HttpServletResponse response) {
    final HttpServletRequest requestF = request;
    Runnable runner  = new Runnable() {
       public void run() {
           String something = requestF.getParameter("anything");
           //do other things...
        }
    };
    Thread thread = new Thread(runner);
    thread.start();

但是当我尝试从请求对象中获取参数时它会引发异常。

Exception in thread "Thread-25" java.lang.NullPointerException
    at org.apache.catalina.connector.Request.parseParameters(Request.java:2560)
    at org.apache.catalina.connector.Request.getParameter(Request.java:1086)
    at org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:355)
    at javax.servlet.ServletRequestWrapper.getParameter(ServletRequestWrapper.java:158)
    at br.com.test.controller.ajax.MyServlet$1.run(MyServlet.java:54)
    at java.lang.Thread.run(Thread.java:619)

requestF对象不为空,我已经检查过了。有谁知道我是否可以访问新的请求对象Thread

4

2 回答 2

4

确实,请求不为空。
我怀疑发生的事情是,由于您引用了请求对象,GC 没有收集它。
但是,在处理响应之后,执行了有关参数的一些清理代码(即 - 删除请求参数的所有条目)。
我想这可能是为了释放内存资源而不是等待 GC,这就是为什么你会遇到这个空指针异常,这不是由于对请求对象的空访问,而是由于参数之一
我建议您获取参数集合,将其复制到新的数据结构(即 - 地图)并将其传递给您的线程。
此外,您应该考虑是否希望您的线程在响应发送到客户端之前运行,但这纯粹是一个设计问题。

于 2012-07-26T18:23:17.517 回答
2

是的,扎斯克是对的。您可以使用地图对象的新实例进行复制,如下所示:

final Map<String,String> mapParameters = new HashMap<String,String>();
mapParameters.putAll(request.getParameterMap());

并在“运行”方法中使用 mapParameters:

public void doPost(HttpServletRequest request, HttpServletResponse response) {
    final Map<String,String> mapParameters = new HashMap<String,String>();
    mapParameters.putAll(request.getParameterMap());
    Runnable runner  = new Runnable() {
       public void run() {
           String something = mapParameters.get("anything");
           //do other things...
       }
    };
    Thread thread = new Thread(runner);
    thread.start();
}
于 2012-07-26T18:36:06.207 回答