Как работает конструкция try-with-resources в Java и каковы её преимущества?

«Как работает конструкция try-with-resources в Java и каковы её преимущества?» — вопрос из категории Основы программирования, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Синтаксис и пример:

// Ресурсы объявляются в круглых скобках после try
// Они будут автоматически закрыты после выхода из блока try

try (FileReader reader = new FileReader("data.txt");
     BufferedReader br = new BufferedReader(reader)) {
    // Работа с ресурсами
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException e) { // Исключения при работе с ресурсами или в блоке try
    System.err.println("Error reading file: " + e.getMessage());
}
// Здесь reader и br уже закрыты, даже если было исключение

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

  1. Автоматическое управление ресурсами: Компилятор гарантированно вставит вызов close().
  2. Подавление исключений: Если в блоке try и в методе close() возникли исключения, исключение из блока try не будет "проглочено". Исключение из close() добавляется как подавленное (Suppressed Exception), и его можно получить через Throwable.getSuppressed().
  3. Краткость и безопасность: Код становится чище и менее подвержен ошибкам "утечки" ресурсов.

Важное условие: Класс ресурса должен реализовывать AutoCloseable. Все стандартные классы для работы с IO, JDBC (Connection, Statement, ResultSet) и другими ресурсами уже его реализуют.