Разбор поведения блоков try‑catch‑finally

В stdout будут 2 и 5. Деление на ноль вызывает ArithmeticException; первый catch печатает 2 и выбрасывает новое исключение, после чего finally печатает 5.

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

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

В 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.

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

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

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

Подробнее