В stdout будут строки 2 и 4. После этого RuntimeException выйдет из main; строка 5 не выполнится. Сообщение и stack trace необработанного исключения обычно попадут в stderr.
Как работает цепочка try‑catch‑finally при возникновении исключения
В 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 в общей консоли может отличаться из-за отдельных потоков вывода.