HttpServletResponse getWriter() 写函数几天后开始抛出空指针异常?

Posted

技术标签:

【中文标题】HttpServletResponse getWriter() 写函数几天后开始抛出空指针异常?【英文标题】:HttpServletResponse getWriter() write function starts to throw nullpointer exception after a few days? 【发布时间】:2020-06-10 19:32:01 【问题描述】:

我在码头服务器上实现了以下 servlet post 功能。在 HttpServletResponse 中,它只会写一些字符串。

protected void doPost(HttpServletRequest request, HttpServletResponse response) 
    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setContentType("application/json");
    response.setCharacterEncoding("UTF-8");
    response.getWriter().write("some json string");
    response.getWriter().flush();

一开始一切都很好。但过了一段时间(几天;我没有使用它,只是让码头服务器保持运行),servlet 开始在response.getWriter().write("some json string"); 行上抛出空指针异常@

java.lang.NullPointerException
        at org.eclipse.jetty.server.ResponseWriter.write(ResponseWriter.java:246)

我不知道出了什么问题。但是重启码头服务器后,问题就消失了。你们知道为什么吗?

【问题讨论】:

您使用的是哪个版本的 Jetty? jetty-distribution-9.4.22.v20191022 【参考方案1】:

回答 NullPointerException

java.lang.NullPointerException
        at org.eclipse.jetty.server.ResponseWriter.write(ResponseWriter.java:246)

您似乎给 Writer 一个空的String

见:https://github.com/eclipse/jetty.project/blob/jetty-9.4.22.v20191022/jetty-server/src/main/java/org/eclipse/jetty/server/ResponseWriter.java#L246

您说 Jetty 几天后停止工作的部分可能是因为您的计算机上有一个进程定期清理系统临时目录,从 Jetty 下删除内容。

见:Jetty stops responding after some period of time

NullPointerException 很可能是因为写入失败并且您没有检查该事实。

HttpServletResponse.getWriter() 返回一个java.io.PrintWriter

使用各种.write() 方法永远不会抛出错误或异常。

您需要使用.checkError() 方法知道何时写入失败。

这是对 java.io.PrintWriter 的老式 API 决定,实际上非常尴尬。

见:PrintWriter and PrintStream never throw IOExceptions

【讨论】:

我猜问题是从 getWriter() 返回的 PrinterWriter 为空。但是怎么做呢? 啊——作者不为空。字符串是。

以上是关于HttpServletResponse getWriter() 写函数几天后开始抛出空指针异常?的主要内容,如果未能解决你的问题,请参考以下文章

Servlet进阶4(HttpServletResponse 类)

HttpServletrequest 与HttpServletResponse总结

HttpServletResponse与HttpServletRequest

HttpServletResponse 工具类

HttpServletResponse

HttpServletResponse