Что такое конструкция try-catch с ресурсами (try-with-resources) в Java?

«Что такое конструкция try-catch с ресурсами (try-with-resources) в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Try-with-resources – это синтаксическая конструкция, представленная в Java 7, для автоматического управления ресурсами, которые необходимо закрывать после использования (например, потоки ввода-вывода, соединения с БД).

Как работает: Ресурс, объявленный в скобках после try, автоматически закрывается при выходе из блока (даже при возникновении исключения). Ресурс должен реализовывать интерфейс java.lang.AutoCloseable.

Синтаксис:

try (ResourceType resource = new ResourceType(...)) {
    // Использование ресурса
} catch (ExceptionType e) {
    // Обработка исключений из блока try
}
// Ресурс 'resource' здесь уже закрыт

Пример: чтение файла

// До Java 7: ручное закрытие в finally
FileInputStream fis = null;
try {
    fis = new FileInputStream("file.txt");
    // ... чтение
} finally {
    if (fis != null) fis.close(); // Может выбросить исключение
}

// С Java 7: try-with-resources
try (FileInputStream fis = new FileInputStream("file.txt");
     BufferedReader br = new BufferedReader(new InputStreamReader(fis))) {
    String line = br.readLine();
    System.out.println(line);
} catch (IOException e) {
    e.printStackTrace();
}
// fis и br закрываются автоматически в корректном порядке

Ключевые особенности:

  1. Автоматическое закрытие: Метод close() вызывается автоматически.
  2. Порядок закрытия: Ресурсы закрываются в порядке, обратном их объявлению.
  3. Подавленные исключения: Если исключения возникают и в блоке try, и при закрытии, исключение из блока try передаётся вызывающему коду, а исключения от close() добавляются к нему как подавленные (доступны через Throwable.getSuppressed()).

Почему это best practice: Устраняет шаблонный код, предотвращает утечки ресурсов из-за забытого вызова close() и корректно обрабатывает исключения при закрытии.