Если подразумеваемые throw действительно выполняются, наружу выйдет E3 из finally: он заменит E2 из catch. В буквально приведённом коде throw находятся в комментариях и не исполняются.
Определение, какое исключение будет проброшено при наличии throw в блоках try, catch и finally
Если подразумеваемые 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, чтобы не потерять первоначальную причину сбоя.