Ответ
Классы, используемые в конструкции try-with-resources, должны удовлетворять следующим требованиям:
1. Обязательная реализация интерфейса
java.lang.AutoCloseable(Java 7+) илиjava.io.Closeable(наследует отAutoCloseable)
2. Реализация метода close()
public class CustomResource implements AutoCloseable {
@Override
public void close() throws Exception {
// Освобождение ресурсов
System.out.println("Resource closed");
}
}
3. Правила использования
try (FileInputStream fis = new FileInputStream("file.txt");
BufferedInputStream bis = new BufferedInputStream(fis)) {
// Работа с ресурсами
} // Автоматический вызов close() в обратном порядке
4. Особенности обработки исключений
- Исключения из
close()добавляются как suppressed к основному исключению - Можно получить их через
Throwable.getSuppressed()
5. Дополнительные возможности
// Ресурсы могут быть объявлены заранее
CustomResource res = new CustomResource();
try (res) { // Доступно с Java 9
// ...
}
// Переопределение close() без исключений
@Override
public void close() { // Без throws Exception
// Безопасное закрытие
}
Практическое правило: Всегда реализуйте AutoCloseable для классов, управляющих внешними ресурсами (файлы, сетевые соединения, БД).