сервлет java PrintWriter # исключение сброса при сбросе - PullRequest
0 голосов
/ 28 марта 2019

У меня есть следующий код сервлета:

@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

Но в выводе браузера Iожидал исключения NullPointerException.

Когда я комментирую вызов flash (),

//writer.flush();

происходит исключение NullPointerException.

Я знаю, что вызов flush () немедленно сбрасывает содержимое в ответ итакже совершить ответ.Но я не понимаю, почему это блокирует генерирование исключений, потому что в то же время тексты "Some text 2" и "MyServlet :: doGet 2" пришли к выводу.

Буду рад любым идеям.Спасибо.

1 Ответ

1 голос
/ 28 марта 2019

Но я не понимаю, почему это блокирует исключение

Это не «блокирует» исключение. Исключение все еще случается.

Однако контейнер сервлета обрабатывает исключения, вызывая requestDispatcher.forward() вызов страницы ошибки или httpServletResponse.sendError(), и это невозможно сделать, если ответ уже был принят.

Поскольку ответ был зафиксирован, клиент просто не может быть уведомлен об ошибке. Ошибка все еще регистрируется, хотя.

...