Что такое try-with-resources в Java и как это работает?

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

Ответ

Try-with-resources — это конструкция языка Java (появилась в Java 7), предназначенная для автоматического управления ресурсами, которые необходимо закрывать после использования. Ресурсом считается любой объект, реализующий интерфейс java.lang.AutoCloseable (или его предшественник java.io.Closeable).

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

Пример использования:

try (FileInputStream fis = new FileInputStream("file.txt");
     BufferedReader br = new BufferedReader(new InputStreamReader(fis))) {
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException e) {
    e.printStackTrace();
}
// Здесь fis и br будут закрыты автоматически, даже если возникнет исключение.

Ключевые преимущества и особенности:

  1. Автоматическое закрытие: Избавляет от необходимости писать блок finally для ручного закрытия, уменьшая шаблонный код и риск утечек ресурсов.
  2. Подавление исключений: Если в блоке try и при закрытии ресурса (close()) возникли исключения, исключение из блока try добавляется в подавленные (suppressed) исключения основного исключения, что позволяет не терять информацию об ошибках.
  3. Объявление ресурсов: Ресурсы можно объявлять непосредственно в скобках try (как в примере) или использовать уже существующие final/effectively final переменные (с Java 9).
  4. Совместимость: Блоки catch и finally остаются опциональными и работают как обычно.