Если исключение выпало и в try, и при закрытии ресурса (try-with-resources), что поймаем в catch?

Пример:

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

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

Если в блоке try возникает исключение, а при закрытии ресурса в try-with-resources — другое исключение, то в catch будет поймано исключение из блока try, а исключение, возникшее при закрытии ресурса, станет подавленным (suppressed) и будет доступно через метод Throwable.getSuppressed() у основного исключения.

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

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

Если в блоке try возникает исключение, а при закрытии ресурса в try-with-resources — другое исключение, то в catch будет поймано исключение из блока try, а исключение, возникшее при закрытии ресурса, станет подавленным (suppressed) и будет доступно через метод Throwable.getSuppressed() у основного исключения.

Пример:

try (MyResource res = new MyResource()) {
    throw new IOException("Ошибка в try");
} catch (IOException e) {
    System.out.println("Основное исключение: " + e.getMessage());
    for (Throwable suppressed : e.getSuppressed()) {
        System.out.println("Подавленное исключение: " + suppressed.getMessage());
    }
}

В этом примере в catch будет поймано исключение "Ошибка в try", а исключение, возникшее при закрытии ресурса, будет подавлено и доступно через getSuppressed().

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

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

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

Подробнее