Ресурсы закрываются в обратном порядке: R3, R2, R1. Закрытие происходит при выходе из тела try, до связанного catch/finally, в том числе при return или исключении.
Определение порядка вызова методов close() в блоке try‑with‑resources
Ресурсы закрываются в обратном порядке: R3, R2, R1. Закрытие происходит при выходе из тела try, до связанного catch/finally, в том числе при return или исключении.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Дано объявление трёх ресурсов R1, R2 и R3. Требуется объяснить следующее:
- В каком порядке будет выполнен вызов close() для указанных ресурсов?
- Когда именно начинается процесс закрытия: до выхода из блока try или после него?
- Как будет вести себя механизм, если один из методов close() бросит исключение?
try (R1 r1 = ...; R2 r2 = ...; R3 r3 = ...) {
...
}
Ответ
Ресурсы закрываются в обратном порядке: R3, R2, R1. Закрытие происходит при выходе из тела try, до связанного catch/finally, в том числе при return или исключении.
Если тело try бросило исключение, оно остаётся основным, а ошибки close добавляются в suppressed. Если тело завершилось успешно, первая ошибка закрытия становится основной, последующие — suppressed. Закрытие остальных ресурсов всё равно предпринимается. При сбое создания R3 закроются только успешно созданные R2 и R1. Null-ресурс пропускается. Получить дополнительные ошибки можно через Throwable.getSuppressed().