Как работает цепочка try‑catch‑finally при возникновении исключения

В stdout будут строки 2 и 4. После этого RuntimeException выйдет из main; строка 5 не выполнится. Сообщение и stack trace необработанного исключения обычно попадут в stderr.

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

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

В stdout будут строки 2 и 4. После этого RuntimeException выйдет из main; строка 5 не выполнится. Сообщение и stack trace необработанного исключения обычно попадут в stderr.

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

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

Условие

Определите, какой вывод появится в консоли при выполнении приведённого ниже фрагмента кода. Требуется пояснить, как взаимодействуют блоки catch, блок finally и повторный бросок нового исключения.

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();
    } catch (Exception e) {
        System.out.println("3");
    } finally {
        System.out.println("4");
    }
    System.out.println("5");
}

Ответ

В stdout будут строки 2 и 4. После этого RuntimeException выйдет из main; строка 5 не выполнится. Сообщение и stack trace необработанного исключения обычно попадут в stderr.

Деление на ноль вызывает ArithmeticException до печати 1. Первый catch печатает 2 и бросает новое исключение. Соседний catch не перехватывает исключения, возникшие внутри другого catch. Перед выходом выполняется finally и печатает 4. Порядок отображения stdout и stderr в общей консоли может отличаться из-за отдельных потоков вывода.

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

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

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

Подробнее