try-with-resources是java 7引入的自动管理autocloseable资源的语法糖,确保资源在try块结束时逆序自动关闭,避免泄漏;资源需实现autocloseable接口,支持多资源声明与抑制异常处理。

try-with-resources 是 Java 7 引入的语法糖,专为自动管理实现了 AutoCloseable 接口的资源而设计,能彻底避免因忘记调用 close() 导致的资源泄漏,比传统 try-catch-finally 更简洁、安全。
资源必须实现 AutoCloseable 接口
只有实现了 AutoCloseable(或其子接口 Closeable)的类才能用于 try-with-resources。常见如 FileInputStream、BufferedReader、Connection、PreparedStatement、Scanner 等。
自定义资源类只需实现 close() 方法,并声明抛出 Exception 或更具体的异常(如 IOException)即可:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
class MyResource implements AutoCloseable {
public void close() throws Exception {
System.out.println("资源已关闭");
}
}
基本写法:声明资源在 try 括号内
资源声明写在 try 后的圆括号中,支持多个资源,用分号分隔。JVM 会在 try 块结束(无论正常退出还是异常退出)后,按声明**逆序**自动调用每个资源的 close() 方法。
- 资源变量作用域仅限 try 块内,不能在 catch 或 finally 中直接访问
- 每个资源都会被独立关闭,即使前一个
close()抛异常,后续资源仍会尝试关闭 - 若 try 块抛异常,且
close()也抛异常,后者会被抑制(suppressed),可通过Throwable.getSuppressed()获取
结合异常处理:捕获主异常,获取抑制异常
当 try 块和资源关闭都发生异常时,主异常(try 中抛出的)会被抛出,关闭异常作为“被抑制异常”附加其中。
示例:
try (FileInputStream fis = new FileInputStream("a.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(fis))) {
reader.readLine(); // 可能抛 IOException
} catch (IOException e) {
System.err.println("主异常: " + e.getMessage());
for (Throwable suppressed : e.getSuppressed()) {
System.err.println("被抑制异常: " + suppressed.getMessage());
}
}
注意点与常见误区
- 不要在 try-with-resources 中手动调用
close(),否则可能重复关闭引发异常 - 资源变量是隐式 final 的,不能在 try 块内重新赋值
- 如果资源创建失败(如构造器抛异常),则不会进入 try 块,也不会触发任何
close()(因为尚未成功创建) - 多个资源间有依赖关系时(如
BufferedReader包裹FileInputStream),应按“内层先声明、外层后声明”的顺序,确保关闭顺序合理(外层先关,内层后关)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










