[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-i-o-nio-chto-takoe-try-with-resources-i-kak-pravilno-zakryvat-resursy":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":18,"progress":19,"seo":20},687,"chto-takoe-try-with-resources-i-kak-pravilno-zakryvat-resursy",15,"i-o-nio","I\u002FO & NIO","📁","Что такое try-with-resources и как правильно закрывать ресурсы?","`try-with-resources` — это конструкция языка Java (Java 7+), которая автоматически закрывает ресурсы, реализующие интерфейс `AutoCloseable`, при выходе из блока `try`.\n\n> Аналогия из жизни: try-with-resources — это как автоматическое выключение света при выходе из комнаты. Вы не забудете выключить свет (закрыть ресурс), даже если уходите в спешке (исключение в try-блоке).\n\n### AutoCloseable и Closeable\n\n```java\npublic interface AutoCloseable {\n    void close() throws Exception;\n}\n\npublic interface Closeable extends AutoCloseable {\n    void close() throws IOException;\n}\n```\n\nВсе потоки IO (`InputStream`, `OutputStream`, `Reader`, `Writer`), каналы NIO (`Channel`), соединения с БД (`Connection`, `Statement`, `ResultSet`) реализуют один из этих интерфейсов.\n\n### Базовый синтаксис\n\n```java\n\u002F\u002F До Java 7 — громоздко и подвержено ошибкам\nInputStream is = null;\ntry {\n    is = new FileInputStream(\"file.txt\");\n    \u002F\u002F чтение\n} finally {\n    if (is != null) { is.close(); } \u002F\u002F может поглотить исключение из try\n}\n\n\u002F\u002F Java 7+ — лаконично и безопасно\ntry (InputStream is = new FileInputStream(\"file.txt\")) {\n    \u002F\u002F чтение\n} \u002F\u002F is.close() вызывается автоматически\n```\n\n### Несколько ресурсов\n\nРесурсы закрываются в обратном порядке объявления:\n\n```java\ntry (FileInputStream fis = new FileInputStream(\"input.txt\");\n     BufferedInputStream bis = new BufferedInputStream(fis);\n     FileOutputStream fos = new FileOutputStream(\"output.txt\")) {\n    bis.transferTo(fos);\n}\n\u002F\u002F Порядок закрытия: fos -> bis -> fis\n```\n\n### Effectively final переменные (Java 9+)\n\n```java\nBufferedReader reader = new BufferedReader(new FileReader(\"file.txt\"));\ntry (reader) { \u002F\u002F reader — effectively final\n    String line = reader.readLine();\n}\n```\n\n### Подавленные исключения (Suppressed Exceptions)\n\nЕсли исключение возникает и в блоке `try`, и в методе `close()`, исключение из `close()` подавляется и добавляется к основному:\n\n```java\ntry (ProblematicResource resource = new ProblematicResource()) {\n    resource.doWork(); \u002F\u002F бросает RuntimeException\n} catch (RuntimeException e) {\n    e.getSuppressed(); \u002F\u002F содержит исключение из close()\n}\n```\n\n### Частые ошибки\n\n- Забывают, что `Stream` от `Files.lines()` тоже реализует `AutoCloseable` и требует `try-with-resources`.\n- Закрывают обёртку и внутренний поток отдельно — при закрытии обёртки (BufferedInputStream) внутренний поток закрывается автоматически.\n- Используют `try-with-resources` без `catch` и считают, что исключения обработаны — конструкция только закрывает ресурсы, но не обрабатывает исключения.\n- В старом коде с `finally` исключение в `close()` может поглотить основное исключение из `try`.\n\n> **На собеседовании:** объясните механизм: ресурсы реализуют AutoCloseable, закрываются автоматически при выходе из try, в обратном порядке объявления. Упомяните suppressed exceptions и effectively final (Java 9+).","","junior",[15,16,17],"core","основы","io",[],null,{"title":21,"description":22,"ogTitle":23,"ogDescription":24,"keywords":25,"schemaAnswer":36,"featuredSnippetReady":37},"try-with-resources в Java — Gymterview","try-with-resources: автоматическое закрытие ресурсов AutoCloseable (Java 7+). Порядок закрытия, suppressed exceptions, effectively final (Java 9+).","try-with-resources — автоматическое закрытие ресурсов — Gymterview","Как try-with-resources автоматически закрывает ресурсы. Порядок закрытия, подавленные исключения, effectively final.",[26,27,28,29,30,31,32,33,34,35],"try-with-resources","AutoCloseable","Closeable","close","suppressed exceptions","effectively final","Java 7","Java 9","ресурсы","собеседование","try-with-resources (Java 7+) — конструкция, автоматически закрывающая ресурсы AutoCloseable при выходе из try. Ресурсы закрываются в обратном порядке объявления. Если исключение в try и close() — исключение close() становится suppressed (getSuppressed()). С Java 9 можно использовать effectively final переменные. Работает для InputStream, OutputStream, Connection, Channel, Stream от Files.lines().",true]