Выбор ответа Middle Исключения обновлено

Исключение в close

Вопрос

В try-with-resources тело бросило IllegalStateException, а close() бросил IOException. Что получит внешний код?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: IllegalStateException, а IOException будет в getSuppressed(). try-with-resources сохраняет основное исключение из тела и прикрепляет исключения закрытия как suppressed (Throwable.addSuppressed).

Варианты ответа

  1. IllegalStateException, а IOException будет в getSuppressed()правильный ответ
  2. IOException: оно брошено последним и затирает исключение из тела
  3. Оба исключения подряд: сначала из тела, потом из close()
  4. IOException, обёрнутое в IllegalStateException как cause

Разбор

try-with-resources сохраняет основное исключение из тела и прикрепляет исключения закрытия как suppressed (Throwable.addSuppressed). Ручной finally вёл бы себя иначе: исключение из close затёрло бы основное. Бросить два исключения сразу невозможно. Cause тут не используется, suppressed это отдельный механизм.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.