java 7 的 try-with-resources 可自动关闭 autocloseable 资源,避免泄漏;需资源实现 autocloseable(如 fileinputstream、connection 等);声明在 try 括号内,分号分隔,逆序关闭;close 异常被抑制并附加到主异常;可与 catch 混用,但不可重复 close。

Java 7 引入的 try-with-resources 语法能自动关闭实现了 AutoCloseable 接口的资源(如文件流、数据库连接等),避免手动调用 close(),大幅降低资源泄漏风险。
确保资源类型支持自动关闭
只有实现 AutoCloseable(或其子接口 Closeable)的类才能用于 try-with-resources。常见如:
-
FileInputStream/FileOutputStream -
BufferedReader/BufferedWriter -
ObjectInputStream/ObjectOutputStream -
Connection、Statement、ResultSet(JDBC 4.1+)
自定义类只需实现 AutoCloseable 并在 close() 中释放底层句柄即可。
基本写法:在 try 括号内声明资源
资源声明必须是带初始化的局部变量,且作用域仅限于该 try 块:
try (FileInputStream fis = new FileInputStream("data.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(fis))) {
String line = reader.readLine();
System.out.println(line);
} // fis 和 reader 在此处自动 close(),无需 catch 或 finally
多个资源用分号分隔,关闭顺序与声明顺序相反(后声明的先关闭),符合嵌套资源的释放逻辑。
异常处理:抑制异常(Suppressed Exception)
如果 try 块抛出异常,且 close() 也抛出异常,后者会被“抑制”并附加到主异常上:
try (FileInputStream fis = new FileInputStream("missing.txt")) {
// 文件不存在 → 抛出 FileNotFoundException
} catch (IOException e) {
// 可通过 e.getSuppressed() 查看被抑制的 close 异常(如有)
for (Throwable s : e.getSuppressed()) {
System.err.println("Suppressed: " + s);
}
}
这种机制保证主异常不被覆盖,同时不丢失关闭阶段的错误信息。
兼容旧代码:可与传统 try-catch-finally 混用
若需捕获特定异常或做额外清理,仍可嵌套使用:
try (BufferedWriter writer = Files.newBufferedWriter(Paths.get("out.txt"))) {
writer.write("Hello");
} catch (IOException e) {
logger.error("写入失败", e);
} // writer 自动关闭,无需 finally
注意:不要在 try-with-resources 外再手动调用 close(),否则可能触发 IllegalStateException(如 BufferedWriter 关闭后再次 close)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











