Определение порядка вызова методов close() в блоке try‑with‑resources

Ресурсы закрываются в обратном порядке: R3, R2, R1. Закрытие происходит при выходе из тела try, до связанного catch/finally, в том числе при return или исключении.

Короткий ответ

Что ответить на собеседовании

Ресурсы закрываются в обратном порядке: 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().

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее