java servlet PrintWriter#flush 停止抛出异常

java servlet PrintWriter#flush stop throwing Exception

我有以下 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" 文本。

任何想法都会很高兴。 谢谢。

But I do not get why this is blocking the exception throw

"block"这不是例外。异常仍然发生。

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

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