Какое ключевое требование к ресурсам, используемым в конструкции try-with-resources в Java?

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

Ответ

Ресурс, объявляемый в try-with-resources, должен реализовывать интерфейс java.lang.AutoCloseable (введен в Java 7) или его более старый подынтерфейс java.io.Closeable.

Почему это требование: Конструкция гарантирует автоматический вызов метода close() для каждого ресурса по завершении блока try, даже в случае возникновения исключения. Наличие интерфейса — это контракт, гарантирующий, что такой метод существует.

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

// FileInputStream и BufferedReader реализуют AutoCloseable
try (FileInputStream fis = new FileInputStream("data.bin");
     BufferedReader reader = new BufferedReader(new InputStreamReader(fis))) {
    String line = reader.readLine();
    // работа с ресурсами...
} // Здесь JVM автоматически вызовет reader.close(), затем fis.close()

Важные детали:

  • Ресурсы закрываются в обратном порядке их создания (LIFO).
  • Исключение в блоке try и в методе close() не «гасит» друг друга. Исключение из close() добавляется как suppressed к основному.
  • Попытка использовать не-AutoCloseable ресурс приведет к ошибке компиляции.