Зачем писать "Попробуй с ресурсами без улова" или "Наконец"?

Зачем писать «Попробуй без ловушки» или «Наконец-то», как в следующем примере?

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>");
    }

}

person Umair Hashmi    schedule 14.10.2014    source источник
comment
прочитать о попытках с ресурсами (Java 7)   -  person Eran    schedule 14.10.2014
comment
См. Попробуйте использовать ресурсы   -  person Justin    schedule 14.10.2014
comment
Дубликат. Имеет ли смысл делать «наконец-то попробуй» без «улова»?   -  person Juru    schedule 14.10.2014
comment
@Juru: Это ни в коем случае не дубликат того ...   -  person Oliver Charlesworth    schedule 14.10.2014
comment
Сказав это, я не думаю, что это первый вопрос о try-with-resources. Тем не менее, +1 просто потому, что я никогда раньше не слышал об этой функции!   -  person Oliver Charlesworth    schedule 14.10.2014
comment
Правильно, плохо, я был слишком быстр.   -  person Juru    schedule 14.10.2014
comment
Возможный дубликат Почему блок захвата try-with-resources является выборочно необязательным ?   -  person tkruse    schedule 13.12.2017


Ответы (2)


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

Любой объект, реализующий 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, поскольку класс реализует интерфейс java.lang.AutoCloseable, и он будет закрыт независимо от того, успешно или нет выполняется блок try, что означает, что вам не придется писать br.close() явно.

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

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

Поскольку @Aaron уже ответил выше, я просто попытался вам объяснить. Надеюсь, поможет.

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

person Syed Ali Taqi    schedule 14.10.2014
comment
Это аналогично тому, как C # использует & IDisposable. - person roufamatic; 25.10.2016
comment
@roufamatic да, аналогично, хотя большая разница в том, что using в C # никоим образом не защищает от исключений, он просто гарантирует закрытие ресурса в конце блока. В C # чаще всего приходится комбинировать using блоков с try блоками. try-with-resources Java делает это вместе. - person Michael Plautz; 27.04.2018

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

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

См. Заявление об использовании ресурсов

person Aaron Digulla    schedule 14.10.2014
comment
Они не эквивалентны. Если исключение возникает из обоих блоков try и finally, исключение из блока try будет подавлено с помощью функции try-and-catch. С другой стороны, если вы используете оператор try-with-resources, исключение из блока finally (исключение автоматического закрытия) будет подавлено. - person Nier; 21.12.2017
comment
@Nier Исправлена ​​финальная часть. - person Aaron Digulla; 30.12.2017