try-with-resources语句用于自动关闭实现了AutoCloseable接口的资源,如InputStream、Connection等,按声明逆序关闭,避免资源泄漏,比传统finally更简洁安全。

Java中的try-with-resources语句用于自动管理资源,确保在代码块执行完毕后(无论是否发生异常),实现了AutoCloseable接口的资源会被自动关闭,避免资源泄漏。
哪些资源能用try-with-resources?
必须是实现了java.lang.AutoCloseable接口的类,比如InputStream、OutputStream、Reader、Writer、Connection、Statement、ResultSet等。自定义类只要重写close()方法并实现该接口,也能使用。
- 常见JDK类基本都已实现,如
FileInputStream、BufferedReader、PreparedStatement - 注意:
close()方法在try块结束时被调用,即使发生异常也会执行 - 如果资源为
null,不会调用close(),也不会抛出空指针异常
语法结构与执行顺序
资源声明写在try后面的圆括号中,多个资源用分号隔开。它们按声明顺序创建,但按**逆序**关闭——后声明的先关闭,这符合嵌套资源的依赖逻辑(比如先关BufferedReader,再关底层FileInputStream)。
- 资源初始化失败(构造抛异常),后续资源不创建,已创建的会正常关闭
- 如果
close()本身抛出异常,且try块中已有异常,后者会被抑制(suppressed),可通过Throwable.getSuppressed()获取 - 示例:
try (FileInputStream fis = new FileInputStream("a.txt"); BufferedReader br = new BufferedReader(new InputStreamReader(fis))) { ... }
相比传统finally手动关闭的优势
传统方式需在finally中判空并调用close(),代码冗长且容易遗漏或出错;try-with-resources将资源生命周期与作用域绑定,更简洁、安全、可读性强。
立即学习“Java免费学习笔记(深入)”;
- 无需显式
finally块,减少样板代码 - 自动处理
close()异常的抑制机制,避免掩盖主异常 - 编译器强制检查资源类型是否可关闭,提前发现错误
- 支持在同一try中管理多个资源,逻辑更集中
注意事项和常见误区
不是所有“需要关闭”的对象都适合用try-with-resources。关键看它是否真正实现了AutoCloseable,以及close()是否做了有意义的清理工作。










