Ключевой задачей try-with-resources в Java стало автоматическое и корректное освобождение ресурсов. До появления этой конструкции в Java 7, программисты были вынуждены закрывать ресурсы вручную в блоке finally. Это приводило к дублированию кода и частым ошибкам.
В Java 6 и ниже ресурсами (открытые файлы, потоки, соединения) приходилось управлять вручную через finally, что часто приводило к утечкам.
Вручную написанный код закрытия ресурсов — источник багов, особенно при работе с несколькими исключениями и сложной иерархией catch-блоков. Нет гарантии вызова close() при ошибках.
С Java 7 появился синтаксис try-with-resources, который гарантирует автоматический вызов метода close() для каждого ресурса, реализующего интерфейс AutoCloseable.
Пример кода:
try (BufferedReader reader = new BufferedReader(new FileReader("test.txt"))) { String line = reader.readLine(); System.out.println(line); } catch (IOException e) { e.printStackTrace(); } // reader автоматически закрывается
Ключевые особенности:
AutoCloseable, могут использоваться в try-with-resources.Вопрос 1: Какой интерфейс должен реализовывать ресурс для try-with-resources?
AutoCloseable. Любой объект, имплементирующий этот интерфейс (или Closeable), может использоваться в конструкции.
Вопрос 2: В каком порядке закрываются ресурсы, если их несколько в try-with-resources?
Ресурсы закрываются в обратном порядке их объявления (стек-LIFO):
try (A a = new A(); B b = new B()) { ... } // b.close() вызовется первым, затем a.close()
Вопрос 3: Можно ли использовать try-with-resources для нестандартных объектов, например, с сетевым соединением, на которое нет реализации AutoCloseable?
Нет, но можно реализовать AutoCloseable вручную в своем классе. После этого объект станет совместимым с try-with-resources.
Разработчики вручную закрывали JDBC Connection и Statement через finally. При возникновении второго исключения закрытие Statement не выполнялось, соединение «подвисло» и спрятало ошибку.
Плюсы:
Минусы:
После внедрения try-with-resources в модуле загрузки файлов все потоки закрываются автоматически, код стал намного короче, исчезли баги утечки файловых дескрипторов.
Плюсы:
Минусы: