Java中try-with-resources可自动关闭AutoCloseable资源,按声明逆序关闭,支持多资源分号分隔,close异常被抑制并可通过getSuppressed()获取。

Java 中使用 try-with-resources 可以自动关闭实现了 AutoCloseable 接口的资源对象,避免手动调用 close(),减少资源泄漏风险。
资源必须实现 AutoCloseable 接口
只有实现了 AutoCloseable(或其子接口 Closeable)的类才能用于 try-with-resources。常见如 FileInputStream、BufferedReader、Connection、Statement 等。
自定义类若需支持,只需实现 AutoCloseable 并提供 close() 方法:
@Override
public void close() throws Exception {
// 释放资源逻辑
}
}
基本语法:在 try 后括号内声明资源
资源在 try 括号中声明,作用域限于 try 块,JVM 会在 try 块结束(无论正常还是异常退出)时自动调用 close()。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 多个资源用分号分隔,按声明顺序的逆序关闭(后声明的先关闭)
- 资源变量是隐式 final 的,不能在 try 块内重新赋值
- 可与 catch、finally 配合使用,异常处理逻辑不变
典型用法示例
读取文件并自动关闭流:
try (FileInputStream fis = new FileInputStream("data.txt");BufferedInputStream bis = new BufferedInputStream(fis)) {
int data;
while ((data = bis.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}
上面代码中,bis 先关闭,然后 fis 关闭(因为 bis 在后声明)。
异常处理细节
如果 try 块抛出异常,且资源关闭时也抛出异常,后者会被抑制(suppressed),主异常仍被抛出,可通过 Throwable.getSuppressed() 获取被抑制的异常。
- 不建议在
close()中抛出检查异常(除非必要),否则可能干扰主异常传播 - 若多个资源关闭都失败,只有第一个关闭异常作为主异常,其余为 suppressed
- 可在 catch 块中调用
e.getSuppressed()查看是否有被抑制的异常

















