【问题标题】:What causes this NPE in org.apache.catalina.connector.CoyoteWriter.flush()?是什么导致 org.apache.catalina.connector.CoyoteWriter.flush() 中出现此 NPE?
【发布时间】:2017-06-09 17:11:16
【问题描述】:
 private void respond(String response) {

    httpServletResponse.setContentType("application/json");
    httpServletResponse.setCharacterEncoding("UTF-8");

    try {
        PrintWriter out = httpServletResponse.getWriter();

        out.print(response);
        out.flush();

    } catch (IOException ex) {
        log.error("Error while writing response",ex);
    }

}

此代码在 out.flush() 处抛出空指针。 httpServletResponse 是实例变量。我已验证响应不为空。这个函数是从 Apache 的 aync http 客户端库的 CloseableHttpAsyncClient.execute.completed() 内部调用的。

LOG:

Caused by: java.lang.NullPointerException: null
    at org.apache.coyote.http11.InternalNioOutputBuffer.flushBuffer(InternalNioOutputBuffer.java:234) ~[tomcat-coyote.jar:8.0.14]
    at org.apache.coyote.http11.InternalNioOutputBuffer.addToBB(InternalNioOutputBuffer.java:189) ~[tomcat-coyote.jar:8.0.14]
    at org.apache.coyote.http11.InternalNioOutputBuffer.commit(InternalNioOutputBuffer.java:177) ~[tomcat-coyote.jar:8.0.14]
    at org.apache.coyote.http11.AbstractHttp11Processor.action(AbstractHttp11Processor.java:739) ~[tomcat-coyote.jar:8.0.14]
    at org.apache.coyote.Response.action(Response.java:179) ~[tomcat-coyote.jar:8.0.14]
    at org.apache.coyote.Response.sendHeaders(Response.java:341) ~[tomcat-coyote.jar:8.0.14]
    at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:331) ~[catalina.jar:8.0.14]
    at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:313) ~[catalina.jar:8.0.14]
    at org.apache.catalina.connector.CoyoteWriter.flush(CoyoteWriter.java:98) ~[catalina.jar:8.0.14]
    at com.thruport.aje.rotator.reward.async.RewardRequest.respond(RewardRequest.java:185) ~[output/:na]
    at com.thruport.aje.rotator.reward.async.RewardRequest.lambda$new$2(RewardRequest.java:131) ~[output/:na]
    at java.util.concurrent.CompletableFuture.uniApply(CompletableFuture.java:602) ~[na:1.8.0_121]
    ... 8 common frames omitted

【问题讨论】:

  • "此代码在 out.flush() 处抛出空指针。" => 没门!它会首先在out.print(response) 行抛出一个 NPE。
  • 你有 Stacktrace 吗?请编辑您的问题并将其插入。
  • 如果上面的行成功,.flush() 不可能抛出 NPE。您的步进调试器将显示这一事实以及实际导致 NPE 的原因。
  • 伙计们,别再说了“不可能到处乱扔NPE”PrintWriter 实例来自 httpServletResponse.getWriter();。所以,PrintWriterflush 的默认实现不是必需的。 Reading the Coyote code here,这可能是 Apache Coyote 的一个错误(我不知道)。

标签: java tomcat


【解决方案1】:

事实证明,我不应该在这里刷新,因为 Servlet 容器会在 Servlet 生命周期结束时处理它,并且在这个阶段缓冲区不会准备好刷新。这 Nullpointer exception while flushing ServletOutputStream 和这个 Should one call .close() on HttpServletResponse.getOutputStream()/.getWriter()? 答案有帮助。

【讨论】:

  • 嗨。很好,它适合你。但我必须说,这不是一项决议。我们应该可以调用flush()。
猜你喜欢
  • 2019-08-28
  • 2015-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
  • 2020-01-27
  • 1970-01-01
  • 2015-02-16
相关资源
最近更新 更多