java servlet PrintWriter#flush stop throwing

我有一个令人着迷的 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() 调用会立即将内容刷新到响应并提交响应。但我不明白为什么这会阻止异常抛出,因为同时“一些文本2”和“MyServlet::d oGet 2”文本开始输出。


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


红颜莎娜
浏览 61回答 1
1回答

慕姐4208626

但我不明白为什么这会阻止异常抛出它不会“阻止”异常。例外情况仍然会发生。但是,Servlet 容器通过调用错误页或调用来处理异常,如果响应已经提交,则无法执行此操作。requestDispatcher.forward()httpServletResponse.sendError()由于响应已提交,因此根本无法向客户端发出有关错误的通知。但是,错误仍然会记录下来。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java