В конструкции Try-With-Resources закроются ли остальные ресурсы, если при закрытии одного возникнет исключение?

«В конструкции Try-With-Resources закроются ли остальные ресурсы, если при закрытии одного возникнет исключение?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, все объявленные ресурсы будут закрыты.

Механизм Try-With-Resources гарантирует попытку закрытия каждого ресурса в порядке, обратном их инициализации.

Поведение при исключениях:

  1. Если исключение возникает в теле блока try, ресурсы закрываются, а это исключение становится основным.
  2. Если исключение возникает при закрытии ресурса, оно подавляется (added as a suppressed exception). Основным остаётся первое возникшее исключение.

Пример:

try (var in = new FileInputStream("source.txt");
     var out = new FileOutputStream("dest.txt")) {
    // ... операции чтения/записи
} catch (IOException e) {
    // e - основное исключение (например, из тела try)
    Throwable[] suppressed = e.getSuppressed(); // Массив подавленных исключений (например, от close())
}

Практический вывод: Используйте Try-With-Resources для автоматического и безопасного управления ресурсами, даже в случае ошибок.