Java try-with-resources 能自动关闭资源,前提是资源实现AutoCloseable接口;JVM在try块结束时(无论正常或异常)自动调用close()方法,多资源按声明逆序关闭,close异常被抑制并附加到主异常上。

Java 中 try-with-resources 能自动关闭资源,前提是资源实现了 AutoCloseable 接口(包括 Closeable,它是 AutoCloseable 的子接口)。JVM 会在 try 块执行结束(无论正常结束还是抛出异常)后,**自动调用资源的 close() 方法**,无需手动写 finally 块。
哪些资源能用 try-with-resources?
必须是实现了 AutoCloseable 接口的类,常见例子包括:
- InputStream / OutputStream
- Reader / Writer
- java.sql.Connection / Statement / ResultSet
- java.nio.channels.Channel
- 自定义类:只要 public class MyResource implements AutoCloseable { ... }
基本语法和执行顺序
资源声明写在 try 后的圆括号里,多个资源用分号隔开。JVM 按**声明顺序的逆序**关闭资源(后声明的先关闭),确保依赖关系安全:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
try (FileInputStream fis = new FileInputStream("a.txt");
BufferedInputStream bis = new BufferedInputStream(fis)) {
// 使用 fis 和 bis
} // ← 此处自动先调用 bis.close(),再调用 fis.close()
异常处理细节(很重要)
如果 try 块抛出异常,且 close() 也抛出异常,JVM 会把 close 异常作为 suppressed exception(被抑制异常) 附加到主异常上,主异常仍会被抛出:
立即学习“Java免费学习笔记(深入)”;
- 用 exception.getSuppressed() 可获取被抑制的异常
- 不会掩盖原始异常,避免“异常丢失”问题
- 如果只有 close 抛异常,它就是最终抛出的异常
注意事项
- 资源变量是 隐式 final,不能在 try 块内重新赋值
- 资源必须在 try 括号中创建;已存在的变量不能直接引用(除非用“赋值表达式”,但不推荐)
- catch 或 finally 仍可存在,用于处理 try 块中的异常,但不要在其中重复 close
- 关闭过程本身不中断 try 块执行——close 总是在 try 块退出后才发生

















