Что выведет код Senior Исключения обновлено

Что выведет: try-with-resources и suppressed

Вопрос

Что выведет программа (Java 21)? Каждый вывод println с новой строки.

public class Main {
    static class Res implements AutoCloseable {
        final String name;
        Res(String name) { this.name = name; System.out.println("open " + name); }
        @Override public void close() {
            System.out.println("close " + name);
            throw new IllegalStateException("close " + name);
        }
    }
    public static void main(String[] args) {
        try (Res a = new Res("A"); Res b = new Res("B")) {
            System.out.println("body");
            throw new RuntimeException("body");
        } catch (Exception e) {
            System.out.println("caught " + e.getMessage());
            for (Throwable s : e.getSuppressed()) System.out.println("suppressed " + s.getMessage());
        } finally {
            System.out.println("finally");
        }
    }
}

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: open A, open B, body, close B, close A, caught body, suppressed close B, suppressed close A, finally. Ресурсы открываются по порядку, закрываются в обратном, и это происходит до catch.

Что выведет

open A
open B
body
close B
close A
caught body
suppressed close B
suppressed close A
finally

Разбор

Ресурсы открываются по порядку, закрываются в обратном, и это происходит до catch. Основное исключение из тела сохраняется, исключения из close() прикрепляются как suppressed в порядке закрытия. finally выполняется последним.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.