Будет ли try-with-resources закрывать ресурсы, если произойдет исключение?

Будет ли try-with-resources закрывать все открытые ресурсы, если произойдет исключение?

private void insertUserInAccessTable(int user_id) throws SQLException {
    final String sql = "bla bla";   
    try( Connection con = ...; PreparedStatement ps = ... ) {
        ...
        if(i==0) throw new SQLException();
    }
}

person andy007    schedule 19.12.2014    source источник
comment
В этом весь смысл попытки с ресурсами.   -  person Mark Rotteveel    schedule 19.12.2014


Ответы (2)


Да, но не те, которые были инициализированы вне блока try или внутри его тела (после объявлений ресурсов).

// This connection is initialized beforehand and will not be
// closed automatically by try-with-resources
Connection conn = // ...

// The statement WILL always be closed, exception or not, before exiting the try block
try (Statement stmt = conn.createStatement())
{
    // This result set will NOT be closed (directly) by try-with-resources
    ResultSet rs = stmt.executeQuery(/*...*/);
}

* Когда try-with-resources закрывает Statement, JDBC сообщает, что оператор должен закрыть созданный им ResultSet. Таким образом, он может быть закрыт, но только из-за контракта JDBC, а не из-за попытки использования ресурсов.

person William Price    schedule 19.12.2014
comment
Учебник Oracle показывает, что ResultSet оживает внутри тела блока try, и он тоже будет закрыт, потому что оператор будет, не так ли? - person andy007; 19.12.2014
comment
@ Andy Это функция JDBC, и она работает только в том случае, если ваш драйвер JDBC реализован правильно в соответствии со спецификацией. Это не относится ко всем закрываемым объектам в целом. Единственное, что будет закрыто с помощью try-with-resources, — это те элементы, которые перечислены в объявлении ресурса для блока try. - person William Price; 19.12.2014

Он будет закрыт, даже если выдаст исключение.

он будет закрыт независимо от того, завершится ли оператор try нормально или внезапно

Ссылка: http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

person Adil Aliyev    schedule 19.12.2014