Ответ
Ресурс, объявляемый в 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ресурс приведет к ошибке компиляции.