Попытки с ресурсами и возвращаемые операторы в java
Мне интересно, если положить оператор return внутри блока try-with-resources, чтобы он не был автоматически закрыт.
try(Connection conn = ...) {
return conn.createStatement().execute("...");
}
Если я напишу что-то вроде этого, соединение будет закрыто? В документации Oracle указано, что:
Оператор try-with-resources гарантирует, что каждый ресурс будет закрыт в конце инструкции.
Что произойдет, если конец инструкции не будет достигнут из-за оператора возврата?
Ответы
Ответ 1
Основываясь на учебнике Oracle, "[ресурс] будет закрыт независимо от того, закончен ли оператор try нормально или внезапно". Он abruptly
определяет как исключение.
Возвращение внутри try
- пример внезапного завершения, как определено в JLS 14.1.
Ответ 2
Ресурс будет закрыт автоматически (даже с оператором return
), поскольку он реализует интерфейс AutoCloseable
. Вот пример, который выводит "успешно завершен":
public class Main {
public static void main(String[] args) {
try (Foobar foobar = new Foobar()) {
return;
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Foobar implements AutoCloseable {
@Override
public void close() throws Exception {
System.out.println("closed successfully");
}
}