Ответ
Ресурс должен реализовывать интерфейс AutoCloseable (с Java 7+). Его наследник Closeable (из пакета java.io) также подходит, но имеет более узкую спецификацию.
Ключевые отличия:
AutoCloseable.close()может бросать любое исключение типаException.Closeable.close()объявлен для выбрасывания толькоIOException.
Пример использования в try-with-resources:
try (FileInputStream fis = new FileInputStream("file.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fis))) {
// Работа с ресурсами
} // fis.close() и br.close() вызовутся автоматически здесь
Важные детали:
- Ресурсы в
try-with-resourcesзакрываются в обратном порядке их объявления. - Исключения, выброшенные в блоке
try, имеют приоритет. Исключения из методовclose()подавляются, но добавляются в массив подавленных исключений основного исключения (доступны черезgetSuppressed()).