我有一个令人着迷的 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 1MyServlet::doGet 2浏览器输出为:Some text 1Some text 2但是在浏览器输出中,我期望NullPointerException。当我评论flash()调用时//writer.flush();发生 NullPointerException。我知道 flush() 调用会立即将内容刷新到响应并提交响应。但我不明白为什么这会阻止异常抛出,因为同时“一些文本2”和“MyServlet::d oGet 2”文本开始输出。会很高兴有任何想法。谢谢。
1 回答
慕姐4208626
TA贡献1852条经验 获得超7个赞
但我不明白为什么这会阻止异常抛出
它不会“阻止”异常。例外情况仍然会发生。
但是,Servlet 容器通过调用错误页或调用来处理异常,如果响应已经提交,则无法执行此操作。requestDispatcher.forward()
httpServletResponse.sendError()
由于响应已提交,因此根本无法向客户端发出有关错误的通知。但是,错误仍然会记录下来。
添加回答
举报
0/150
提交
取消