Java中try-with-resources可同时管理多个AutoCloseable资源,按声明逆序自动关闭;语法用分号分隔资源声明,支持var;关闭时外层流优先以避免数据丢失;若关闭异常与主异常并存,则关闭异常被抑制并可通过getSuppressed()获取。

Java 中 try-with-resources 可以同时管理多个资源,只要它们都实现了 AutoCloseable 接口(包括 Closeable),JVM 会在 try 块结束时按声明的**逆序**自动关闭它们。
语法:用分号分隔多个资源声明
在 try 后的圆括号内,依次声明多个资源,用分号 ; 隔开。每个资源都是独立的变量声明,支持类型推导(var)或显式类型:
try (FileInputStream fis = new FileInputStream("a.txt");
FileOutputStream fos = new FileOutputStream("b.txt");
BufferedReader reader = new BufferedReader(new FileReader("input.txt"))) {
// 使用资源
int data = fis.read();
fos.write(data);
String line = reader.readLine();
} // fis、fos、reader 按 reader → fos → fis 的顺序自动关闭
关闭顺序是逆序,很重要
资源按声明顺序从左到右书写,但关闭时严格按**相反顺序**执行。这是为了满足依赖关系——比如流包装器(如 BufferedInputStream 包装 FileInputStream)必须先关闭外层,再关闭底层,否则可能丢失缓冲数据或抛出异常。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 声明顺序:
fis → fos → reader - 关闭顺序:
reader → fos → fis
资源可以是 var 或显式类型,但不能重复变量名
支持使用 var 简化写法(JDK 10+),但每个资源变量名必须唯一,且类型需能被准确推断:
立即学习“Java免费学习笔记(深入)”;
try (var conn = DriverManager.getConnection(url);
var stmt = conn.createStatement();
var rs = stmt.executeQuery("SELECT * FROM users")) {
while (rs.next()) {
System.out.println(rs.getString(1));
}
} // rs → stmt → conn 依次关闭
异常处理:抑制异常(Suppressed Exception)
如果 try 块中抛出异常,且多个资源关闭时也抛出异常,只有 try 块的异常会被抛出,其他关闭异常会被“抑制”并可通过 Throwable.getSuppressed() 获取。调试时建议打印抑制异常:
try (BufferedReader r1 = new BufferedReader(...);
BufferedReader r2 = new BufferedReader(...)) {
throw new RuntimeException("main exception");
} catch (Exception e) {
System.out.println("主异常: " + e.getMessage());
for (Throwable s : e.getSuppressed()) {
System.out.println("被抑制的关闭异常: " + s.getMessage());
}
}

















