【问题标题】:Nullpointer exception while flushing ServletOutputStream刷新 ServletOutputStream 时出现 Nullpointer 异常
【发布时间】:2015-04-23 00:48:44
【问题描述】:

这是我在刷新ServletOutputStream 时遇到的一些异常。它不会出现在每个请求上,所以我无法重现它。

java.lang.NullPointerException
    at org.apache.coyote.http11.InternalOutputBuffer.realWriteBytes(InternalOutputBuffer.java:215)
    at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:480)
    at org.apache.coyote.http11.InternalOutputBuffer.flush(InternalOutputBuffer.java:119)
    at org.apache.coyote.http11.AbstractHttp11Processor.action(AbstractHttp11Processor.java:805)
    at org.apache.coyote.Response.action(Response.java:174)
    at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:366)
    at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:333)
    at org.apache.catalina.connector.CoyoteOutputStream.flush(CoyoteOutputStream.java:101)
    at darshan.HttpRequestHandler.returnResponse(HttpRequester.java:117)

HttpRequester.java:

private void returnResponse(HttpServletResponse response , String responseStr)
{
    InputStream in = null;
    ServletOutputStream out = null;
    try
    {
        in = new ByteArrayInputStream(responseStr.getBytes("UTF-8"));
        response.setContentLength(responseStr.length());
        out = response.getOutputStream();

        byte[] outputByte = new byte[4096];
        while(in.read(outputByte, 0, 4096) != -1)
        {
            out.write(outputByte, 0, 4096);
        }
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
    finally
    {
        try
        {
            in.close();
            out.flush();  //<-- Exception at this line
            out.close();
        }
        catch (Exception e) 
        {
            e.printStackTrace();
        }
    }
}

这个错误有什么解决办法???

【问题讨论】:

  • 我认为该流在关闭时被刷新。您是否尝试删除 flush();那么 NPE 是否来自 close() 呢?

标签: java jakarta-ee servlets nullpointerexception


【解决方案1】:

您的代码不需要在输入或输出流上调用flushclose。 servlet 容器将为您处理刷新和关闭。

有时会出现需要手动刷新调用的极端情况,但这不是其中之一。但是,在其中任何一个上调用 close 确实不是一个好主意,并且可能会在 tomcat 中触发导致异常的错误状态。

Should one call .close() on HttpServletResponse.getOutputStream()/.getWriter()?

【讨论】:

    【解决方案2】:

    这里你可能会在最后一个块的内容长度后面写,因为它可能读取不到 4096 字节

    byte[] outputByte = new byte[4096];
        while(in.read(outputByte, 0, 4096) != -1)
        {
            out.write(outputByte, 0, 4096);
        }
    

    【讨论】:

      猜你喜欢
      • 2015-04-16
      • 1970-01-01
      • 2019-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多