Поведение исключений: порядок выполнения блоков try‑catch‑finally

Если все три throw исполняются, наружу выйдет ThirdException. FirstException перехватывается catch; SecondException из catch будет вытеснено исключением из finally.

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

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

Если все три throw исполняются, наружу выйдет ThirdException. FirstException перехватывается catch; SecondException из catch будет вытеснено исключением из finally.

Подробный разбор

Ответ с пояснениями

Условие

Какие типы исключений будут выброшены при запуске данного метода? В каком порядке отрабатывают секции catch и finally? Какие из исключений будут перехвачены, а какие подавятся? Необходимо провести рефакторинг кода.

void executeTask() {
    try {
        // ...
        throw new FirstException();
    } catch (FirstException ex1) {
        // ...
        throw new SecondException();
    } finally {
        // ...
        throw new ThirdException();
    }
}

Ответ

Если все три throw исполняются, наружу выйдет ThirdException. FirstException перехватывается catch; SecondException из catch будет вытеснено исключением из finally.

Обычный finally не добавляет вытесненные исключения в suppressed автоматически. При рефакторинге не бросайте безусловное исключение из блока очистки; исходную ошибку можно передать как cause при оборачивании. Если это работа с AutoCloseable, try-with-resources сохраняет основное исключение и добавляет ошибки close как suppressed. Объявления исключений в примере отсутствуют: для checked-типов дополнительно потребуется корректный throws или обработка.

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

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

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

Подробнее