Ответ
Класс должен реализовывать интерфейс java.lang.AutoCloseable (введен в Java 7) или его подынтерфейс java.io.Closeable.
Условие: Интерфейс AutoCloseable объявляет всего один метод:
void close() throws Exception;
Как это работает: При выходе из блока try (нормальном или из-за исключения) JVM автоматически вызывает метод close() для каждого объявленного ресурса в обратном порядке их инициализации.
Пример корректного использования:
// FileInputStream реализует AutoCloseable (через Closeable)
try (FileInputStream fis = new FileInputStream("file.txt");
Scanner scanner = new Scanner(fis)) { // Scanner тоже реализует Closeable
while (scanner.hasNextLine()) {
System.out.println(scanner.nextLine());
}
} // Здесь автоматически вызываются scanner.close() и fis.close()
// Исключения в close() подавляются, но добавляются в suppressed exceptions
Пример некорректного использования:
try (String notACloseableResource = "Hello") { // ОШИБКА КОМПИЛЯЦИИ
// String не реализует AutoCloseable
}
Ключевые преимущества try-with-resources:
- Автоматическое управление ресурсами: Гарантированное закрытие, даже при возникновении исключения.
- Улучшенная читаемость: Код становится чище по сравнению с ручным
finally-блоком. - Подавленные исключения (suppressed exceptions): Если в
tryи вclose()возникли исключения, исключение изtryбудет основным, а изclose()— подавленным (доступно черезgetSuppressed()).