В stdout будут 2 и 5. Деление на ноль вызывает ArithmeticException; первый catch печатает 2 и выбрасывает новое исключение, после чего finally печатает 5.
Разбор поведения блоков try‑catch‑finally
В stdout будут 2 и 5. Деление на ноль вызывает ArithmeticException; первый catch печатает 2 и выбрасывает новое исключение, после чего finally печатает 5.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Каким будет вывод программы и почему? Какие части кода выполнятся? Почему блок catch (Exception e) не будет вызван? Выполняется ли блок finally при возникновении исключения?
public class ExceptionQuiz {
public static void main(String[] args) {
try {
int i = 1 / 0;
System.out.println("1");
} catch (ArithmeticException e) {
System.out.println("2");
throw new RuntimeException(e);
} catch (Exception e) {
System.out.println("4");
} finally {
System.out.println("5");
}
}
}
Ответ
В stdout будут 2 и 5. Деление на ноль вызывает ArithmeticException; первый catch печатает 2 и выбрасывает новое исключение, после чего finally печатает 5.
Соседний catch(Exception e) не обрабатывает исключение, возникшее внутри предыдущего catch: он относится только к исходному try. Поэтому 1 и 4 не печатаются, а RuntimeException выходит из main со stack trace в stderr. finally при таком обычном распространении исключения выполняется. Это не абсолютная гарантия на случай аварийного завершения процесса или остановки JVM.