try-with-resources 语法自动管理实现了 autocloseable 接口的资源,在 try 块结束时逆序调用 close() 方法,支持抑制异常、避免资源泄漏,比传统 try-finally 更安全简洁。

Java 中 try-with-resources 语法通过在 try 括号内声明实现了 AutoCloseable 接口的资源,让 JVM 在 try 块执行结束(无论正常结束还是抛出异常)后自动调用其 close() 方法,无需手动写 finally 块关闭。
资源必须实现 AutoCloseable 接口
只有实现了 AutoCloseable(或其子接口 Closeable)的类才能用于 try-with-resources。常见如 FileInputStream、BufferedReader、PreparedStatement、Socket 等都满足条件。
- 自定义类若需支持该语法,只需实现
AutoCloseable并提供逻辑清晰的close()方法 - 注意:
close()方法应幂等(多次调用不报错),且尽量避免抛出新异常干扰主流程
语法格式与基本写法
资源声明写在 try 后的圆括号中,多个资源用分号隔开;资源变量作用域仅限于 try 块内。
try (FileInputStream fis = new FileInputStream("a.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fis))) {
String line = br.readLine();
System.out.println(line);
} // ← fis 和 br 在此处自动 close()
- 资源按声明顺序创建,按**逆序**关闭(后声明的先关闭),这符合嵌套资源的依赖关系(如
BufferedReader依赖InputStream) - 即使 try 块中发生异常,所有已成功初始化的资源仍会被关闭
异常处理细节:抑制异常(Suppressed Exception)
如果 try 块抛出异常,且 close() 过程也抛出异常,后者不会覆盖前者,而是作为“被抑制异常”附加到主异常上。
- 可通过
exception.getSuppressed()获取被抑制的异常数组 - 调试时注意:IDE 或日志可能默认不打印被抑制异常,需主动检查
- 若多个资源关闭都失败,只有第一个
close()异常为主异常,其余均被抑制
与传统 try-finally 对比的优势
相比手动在 finally 中关闭,try-with-resources 更简洁、安全、不易出错:
- 避免忘记关闭、重复关闭、关闭顺序错误等问题
- 资源未初始化(如构造函数抛异常)时,不会触发
close(),无空指针风险 - 编译器强制检查资源是否可关闭,提前发现类型错误
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











