Определение, какое исключение будет проброшено при наличии throw в блоках try, catch и finally

Если подразумеваемые throw действительно выполняются, наружу выйдет E3 из finally: он заменит E2 из catch. В буквально приведённом коде throw находятся в комментариях и не исполняются.

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

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

Если подразумеваемые throw действительно выполняются, наружу выйдет E3 из finally: он заменит E2 из catch. В буквально приведённом коде throw находятся в комментариях и не исполняются.

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

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

Условие

Нужно выяснить, какое именно исключение окажется выброшенным, если в каждом из блоков — try, catch и finally — используется оператор throw.

void runTask() {
    try {
        // ... throw new E1(...);
    } catch (E1 ex1) {
        // ... throw new E2(...);
    } finally {
        // ... throw new E3(...);
    }
}

Ответ

Если подразумеваемые throw действительно выполняются, наружу выйдет E3 из finally: он заменит E2 из catch. В буквально приведённом коде throw находятся в комментариях и не исполняются.

При предполагаемой логике E1 ловится первым catch, E2 начинает распространяться наружу, но перед выходом запускается finally и бросает E3. Java не связывает такие ошибки в cause/suppressed автоматически. Для корректного примера нужно раскрыть комментарии и определить классы исключений; checked-типы требуют throws. В реальном коде избегают безусловного throw из finally, чтобы не потерять первоначальную причину сбоя.

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

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

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

Подробнее