Ответ
Try-with-resources – это синтаксическая конструкция, представленная в Java 7, для автоматического управления ресурсами, которые необходимо закрывать после использования (например, потоки ввода-вывода, соединения с БД).
Как работает: Ресурс, объявленный в скобках после try, автоматически закрывается при выходе из блока (даже при возникновении исключения). Ресурс должен реализовывать интерфейс java.lang.AutoCloseable.
Синтаксис:
try (ResourceType resource = new ResourceType(...)) {
// Использование ресурса
} catch (ExceptionType e) {
// Обработка исключений из блока try
}
// Ресурс 'resource' здесь уже закрыт
Пример: чтение файла
// До Java 7: ручное закрытие в finally
FileInputStream fis = null;
try {
fis = new FileInputStream("file.txt");
// ... чтение
} finally {
if (fis != null) fis.close(); // Может выбросить исключение
}
// С Java 7: try-with-resources
try (FileInputStream fis = new FileInputStream("file.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fis))) {
String line = br.readLine();
System.out.println(line);
} catch (IOException e) {
e.printStackTrace();
}
// fis и br закрываются автоматически в корректном порядке
Ключевые особенности:
- Автоматическое закрытие: Метод
close()вызывается автоматически. - Порядок закрытия: Ресурсы закрываются в порядке, обратном их объявлению.
- Подавленные исключения: Если исключения возникают и в блоке
try, и при закрытии, исключение из блокаtryпередаётся вызывающему коду, а исключения отclose()добавляются к нему как подавленные (доступны черезThrowable.getSuppressed()).
Почему это best practice: Устраняет шаблонный код, предотвращает утечки ресурсов из-за забытого вызова close() и корректно обрабатывает исключения при закрытии.