Ответ
try-with-resources — это синтаксическая конструкция, введённая в Java 7, для автоматического управления ресурсами, которые необходимо закрывать после использования (например, потоки ввода-вывода, соединения с БД). Она гарантирует вызов метода close() для каждого объявленного ресурса.
Синтаксис:
try (ResourceType resource1 = new ResourceType(...);
AnotherResource resource2 = new AnotherResource(...)) {
// Используем ресурсы resource1 и resource2
// ...
} catch (ExceptionType e) {
// Обработка исключений, возникших в блоке try или при закрытии
}
// Ресурсы автоматически закрыты здесь
Как это работает:
- Ресурсы, объявленные в круглых скобках после
try, должны реализовывать интерфейсjava.lang.AutoCloseable(который объявляет методclose()). - Компилятор неявно добавляет блок
finally, в котором вызываетclose()для всех объявленных ресурсов. - Ресурсы закрываются в обратном порядке их объявления.
- Если исключение возникает и в блоке
try, и при закрытии ресурсов, подавляется исключение отclose(), а в исключении от блокаtryдобавляется информация о подавленных исключениях (доступны черезThrowable.getSuppressed()).
Пример с файлом:
try (FileInputStream fis = new FileInputStream("input.txt");
FileOutputStream fos = new FileOutputStream("output.txt")) {
int byteData;
while ((byteData = fis.read()) != -1) {
fos.write(byteData);
}
} catch (IOException e) {
System.err.println("Ошибка ввода-вывода: " + e.getMessage());
}
// fis и fos гарантированно закрыты, даже если возникло исключение
Преимущества перед try-catch-finally:
- Краткость и читаемость: Убирает шаблонный код с
finally. - Надёжность: Гарантирует закрытие ресурсов, предотвращая утечки.
- Улучшенная обработка ошибок: Позволяет отслеживать исключения, возникшие при закрытии.
Важно: Для использования в try-with-resources пользовательские классы должны реализовывать AutoCloseable.