try-with-resources
Блок `try`, который сам закрывает открытые ресурсы — файлы, соединения, потоки.
Доступно с: Java 7
Синтаксис
try (Resource r = ...; Resource r2 = ...) {
...
} catch (Exception e) {
...
}Примеры
Ресурс закрывается даже при исключении:
class Connection implements AutoCloseable {
Connection() { IO.println("open"); }
void query() { throw new IllegalStateException("query failed"); }
public void close() { IO.println("close"); }
}
void main() {
try (var conn = new Connection()) {
conn.query();
} catch (IllegalStateException e) {
IO.println("caught: " + e.getMessage());
}
}Результат:
open
close
caught: query failedЧтение файла построчно:
void main() throws IOException {
Path file = Files.createTempFile("demo", ".txt");
Files.writeString(file, "first\nsecond\n");
try (BufferedReader reader = Files.newBufferedReader(file)) {
String line;
while ((line = reader.readLine()) != null) {
IO.println(line);
}
}
Files.delete(file);
}Результат:
first
secondПримечания
Ресурс должен реализовывать AutoCloseable. Несколько ресурсов перечисляются через ; и закрываются в обратном порядке. close() вызывается до блока catch. Если и тело, и close() бросили исключения, исключение из close() не теряется: оно доступно через getSuppressed().
См. также
- try / catch / finally — Перехватывает исключения; finally выполняется всегда, а try с ресурсами сам их закрывает.
- AutoCloseable — Интерфейс ресурса, который можно закрыть в try-with-resources.
- IOException — Проверяемое исключение для ошибок ввода-вывода: файлов, сети, потоков данных.
- ExecutorService.close() — Закрывает пул и ждёт завершения всех задач; вызывается автоматически в try-with-resources.
Вопросы и ответы по теме
В учебнике
- try-with-resources — Автоматическое закрытие ресурсов в Java — try-with-resources, интерфейс AutoCloseable, несколько ресурсов, порядок закрытия и подавленные исключения.