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

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

Вопрос

Что получит вызывающий код?

try {
    throw new RuntimeException("try");
} finally {
    throw new IllegalStateException("finally");
}

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

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

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

Коротко

Правильный ответ: IllegalStateException("finally"), исходное исключение потеряно. Исключение, брошенное в finally, заменяет то, которое летело из try.

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

  1. RuntimeException("try"), а finally молча пропустится
  2. RuntimeException("try") с suppressed IllegalStateException
  3. Оба исключения по очереди: сначала из try, потом из finally
  4. IllegalStateException("finally"), исходное исключение потеряноправильный ответ

Разбор

Исключение, брошенное в finally, заменяет то, которое летело из try. Исходное теряется без следа: suppressed добавляет только try-with-resources. Поэтому в finally код пишут так, чтобы он не бросал, или используют try-with-resources.

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

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