刷新 ServletOutputStream 时出现空指针异常
Nullpointer exception while flushing ServletOutputStream
这是我在刷新时遇到的一些异常 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
或 close
。 servlet 容器将为您处理刷新和关闭。
有时会出现需要手动刷新调用的极端情况,但这不是其中之一。然而,对它们中的任何一个调用 close
确实不是一个好主意,并且可能会触发 tomcat 中的错误状态,从而导致您的异常。
见
这里你可能写在最后一个块的内容长度后面,因为它可能读取不到 4096 字节
byte[] outputByte = new byte[4096];
while(in.read(outputByte, 0, 4096) != -1)
{
out.write(outputByte, 0, 4096);
}
这是我在刷新时遇到的一些异常 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
或 close
。 servlet 容器将为您处理刷新和关闭。
有时会出现需要手动刷新调用的极端情况,但这不是其中之一。然而,对它们中的任何一个调用 close
确实不是一个好主意,并且可能会触发 tomcat 中的错误状态,从而导致您的异常。
见
这里你可能写在最后一个块的内容长度后面,因为它可能读取不到 4096 字节
byte[] outputByte = new byte[4096];
while(in.read(outputByte, 0, 4096) != -1)
{
out.write(outputByte, 0, 4096);
}