Попытки с ресурсами и возвращаемые операторы в 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");
    }
}