java servlet PrintWriter#flush停止引发异常

时间:2019-03-28 15:37:57

标签: java servlets flush

我有以下servlet代码:

@WebServlet("/my")
public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("MyServlet::doGet 1");
        PrintWriter writer = resp.getWriter();
        writer.write("Some text 1 \n");
        writer.flush();
        writer.write("Some text 1 \n");
        System.out.println("MyServlet::doGet 2");
        throw new NullPointerException();
    }
}

日志输出为:

MyServlet::doGet 1
MyServlet::doGet 2

浏览器输出为:

Some text 1
Some text 2

但是在浏览器输出中,我期望出现NullPointerException。

当我评论flash()呼叫

//writer.flush();

发生NullPointerException。

我知道flush()调用会立即刷新内容以响应并提交响应。但是我不明白为什么这阻止了异常抛出,因为同时输出了“ Some text 2”和“ MyServlet :: doGet 2”文本。

对于任何想法都会感到高兴。 谢谢。

1 个答案:

答案 0 :(得分:1)

  

但是我不明白为什么这阻止了异常抛出

它不会“阻止”异常。仍然发生例外。

但是,servlet容器通过对错误页面进行requestDispatcher.forward()调用或对httpServletResponse.sendError()进行调用来处理异常,如果响应已经提交,则无法完成。

由于已提交响应,因此根本无法将错误通知给客户端。该错误仍然记录。