Короткий ответ
Try-with-resources — форма оператора try из Java 7: ресурсы объявляются в круглых скобках после try и автоматически закрываются по завершении блока — нормальном или с исключением — вызовом close() в порядке, обратном их объявлению. Это работает для любого объекта, реализующего AutoCloseable (или его наследника Closeable).
Как это работает подробнее
Ресурс объявляется в круглых скобках после try — это может быть любой объект, реализующий java.lang.AutoCloseable (метод close()). Интерфейс java.io.Closeable расширяет AutoCloseable: его метод close() объявлен с throws IOException.
В старом стиле try-catch-finally ресурсы закрывались вручную, и при исключениях и в теле try, и в close() они могли «потечь», а исходное исключение — затеряться. В try-with-resources наружу уходит исключение из тела try, а исключения из close() добавляются как подавленные (suppressed) — их можно получить через Throwable.getSuppressed().
- Закрытие выполняется в порядке, обратном порядку объявления ресурсов.
- После блока try-with-resources допустимы дополнительные
catchиfinally— они выполняются уже после автоматического закрытия. - Если тело
tryзавершилось успешно, аclose()бросил исключение, наружу уходит исключение изclose().
Пример кода
import java.io.BufferedReader;
import java.nio.file.Files;
import java.nio.file.Path;
public class TryWithResourcesDemo {
static String firstLine(String path) throws Exception {
try (BufferedReader reader = Files.newBufferedReader(Path.of(path))) {
return reader.readLine();
} // reader.close() вызывается автоматически
}
}Что использовать на практике
- Файлы, потоки ввода-вывода, сетевые соединения и JDBC-ресурсы закрывайте через try-with-resources.
- Собственные ресурсы реализуйте через
AutoCloseable, чтобы их можно было использовать в этой конструкции. - Если нужны и закрытие, и обработка ошибки — добавляйте
catch/finallyпосле блока.
Подводные камни
- Ресурсы видны только внутри блока
try— «закрыть пораньше» вручную не получится. - Игнорирование suppressed-исключений может скрыть причину сбоя при закрытии — смотрите их через
Throwable.getSuppressed(). - Не закрывайте ресурс повторно в
finally— try-with-resources уже вызвалclose().
Как отвечать на собеседовании
- Каркас: назовите назначение — автоматическое закрытие ресурсов в Java 7 → опишите синтаксис: ресурсы в скобках после
try→ упомянитеAutoCloseable/Closeableи порядок закрытия → добавьте про suppressed-исключения → приведите пример сBufferedReader.