Для чего предназначена конструкция try-with-resources в Java?

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

Ответ

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

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

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

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

Ключевые преимущества перед try-catch-finally:

  1. Краткость и читаемость: Нет необходимости вручную писать блок finally для закрытия.
  2. Надежность: Гарантированное закрытие всех ресурсов.
  3. Подавление исключений: Если исключения выбрасываются и в блоке try, и при закрытии (close()), исключение из try не "теряется", а исключение из close() добавляется как подавленное (доступно через Throwable.getSuppressed()).

Типичные ресурсы: InputStream, OutputStream, Connection, Statement, ResultSet, Socket.