Подтвердить что ты не робот

Зачем писать Try-With-Resources без Catch или Наконец?

Зачем писать Try без Catch или finally, как в следующем примере?

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    try (PrintWriter out = response.getWriter()) {
        /* TODO output your page here. You may use following sample code. */
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Servlet tryse</title>");            
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Servlet tryse at " + request.getContextPath() + "</h1>");
        out.println("</body>");
        out.println("</html>");
    }

}
4b9b3361

Ответ 1

Как объяснялось выше, это функция Java 7 и выше. try with resources позволяет пропустить запись finally и закрыть все ресурсы, используемые в try-block. Как указано в Docs

Любой объект, реализующий java.lang.AutoCloseable, который включает в себя все объекты, которые реализуют java.io.Closeable, может использоваться как ресурс.

См. этот пример кода

static String readFirstLineFromFile(String path) throws IOException {
try (BufferedReader br =
               new BufferedReader(new FileReader(path))) {
    return br.readLine();
}
}

В этом примере ресурс BufferReader object, так как класс реализует интерфейс java.lang.AutoCloseable, и он будет закрыт, будет ли блок try успешно выполнен или нет, что означает, что вам не нужно явно писать br.close().

Еще одна важная вещь, которую следует отметить здесь, заключается в том, что если вы пишете блок finally самостоятельно и как исключение блока try, так и finally, исключение из блока try подавлено.

С другой стороны, если вы используете оператор try-with-resources, а исключение вызывается как с помощью try block, так и try-with-resources, тогда в этом случае исключение из оператора try-with-resources подавляется.

Как уже сказал Аарон уже выше, я просто попытался вас объяснить. Надеюсь, что это поможет.

Источник: http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

Ответ 2

Это новая функция в Java 7 и более поздних версиях. Без этого вам понадобится блок finally, который закрывает ресурс PrintWriter out. Поэтому приведенный выше код эквивалентен:

PrintWriter out = null;
try {
    PrintWriter out = ...
} finally {
    if(null != out) {
        try {
            out.close();
        } catch(Exception e) {} // silently ignore!
    }
}

См. Заявление о попытках с ресурсами