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

Закрыты ли ресурсы до или после окончательно?

В Java 7 try-with-resources я не знаю, в каком порядке будет создан блок finally и произойдет автоматическое закрытие. Какой порядок?

BaseResource b = new BaseResource(); // not auto-closeable; must be stop'ed
try(AdvancedResource a = new AdvancedResource(b)) {

}
finally {
    b.stop(); // will this happen before or after a.close()?
}
4b9b3361

Ответ 1

Ресурс закрывается перед уловом или, наконец, блокирует. Смотрите tutorial.

Оператор try-with-resources может иметь catch и, наконец, блокировать, как обычный пример try. В заявлении try-with-resources любой блок catch или finally запускается после того, как объявленные ресурсы были закрыты.

Чтобы оценить это пример кода:

class ClosableDummy implements Closeable {
    public void close() {
        System.out.println("closing");
    }
}

public class ClosableDemo {
    public static void main(String[] args) {
        try (ClosableDummy closableDummy = new ClosableDummy()) {
            System.out.println("try exit");
            throw new Exception();
        } catch (Exception ex) {
            System.out.println("catch");
        } finally {
            System.out.println("finally");
        }


    }
}

Вывод:

try exit
closing
catch
finally

Ответ 2

Блок finally выполняется последним:

Кроме того, все ресурсы будут закрыты (или попытались закрыто) к тому времени, когда выполняется блок finally, в соответствии с цель ключевого слова finally.

Цитата из JLS 13; 14.20.3.2. Расширенная попытка с ресурсами: