Короткий ответ
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() вызывается автоматически
}
}