java的try-with-resources会自动调用实现了autocloseable接口的资源的close()方法,按声明逆序关闭,关闭异常作为suppressed exception附加到主异常上。

Java 的 try-with-resources 语法会在 try 块执行结束(无论正常完成还是抛出异常)后,**自动调用资源的 close() 方法**,前提是该资源实现了 java.lang.AutoCloseable 接口(Closeable 是其子接口)。
资源必须实现 AutoCloseable
只有声明为 try-with-resources 括号内的对象,且类型实现了 AutoCloseable,才能被自动关闭。常见如:
-
FileInputStream/FileOutputStream -
BufferedReader/BufferedWriter -
Connection、PreparedStatement、ResultSet(JDBC 4.1+) - 你自己定义的类,只要 重写
close()方法并声明抛出Exception或其子类,也能支持
语法格式要正确
资源声明必须写在 try 后的圆括号中,用分号分隔,不能放在 try 块内部:
try (FileInputStream fis = new FileInputStream("a.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fis))) {
// 使用资源
String line = br.readLine();
} // ← 这里自动触发 br.close() 和 fis.close()
注意:多个资源按**声明顺序创建,按逆序关闭**(后创建的先关闭),这能保证依赖关系合理(比如流包装流时,内层流应后关)。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
异常处理机制有特殊规则
如果 try 块抛出异常,且资源关闭时也抛出异常,后者不会覆盖前者,而是作为 suppressed exception(被抑制的异常) 附加到主异常上:
- 可通过
exception.getSuppressed()获取被抑制的异常数组 - 调试时 IDE 或日志通常会一并打印,避免资源关闭失败被静默忽略
- 如果仅关闭过程出错而 try 块没异常,则抛出关闭异常
不能用变量赋值或复杂表达式直接声明
try-with-resources 括号里只能是资源声明语句,不支持赋值或方法调用等表达式:
- ✅ 正确:
try (BufferedReader br = Files.newBufferedReader(path)) { ... } - ❌ 错误:
BufferedReader br = null; try (br = Files.newBufferedReader(path)) { ... }(编译报错) - ❌ 错误:
try (Files.newBufferedReader(path)) { ... }(缺少变量名和类型声明)
若需复用已有资源或逻辑较复杂,建议改用传统 try-finally,或封装成独立方法返回 AutoCloseable 实例。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










