Java的try-with-resources是JDK 7引入的语法糖,用于自动管理AutoCloseable资源,编译器生成隐式finally调用close(),支持多资源逆序关闭及抑制异常处理。

Java 的 try-with-resources 是 JDK 7 引入的语法糖,用于自动管理实现了 AutoCloseable 接口的资源(如文件流、数据库连接等),无需手动在 finally 块中调用 close()。它本质是编译器生成的隐式 finally 调用,但写法更简洁、安全。
资源必须实现 AutoCloseable 接口
只有声明为 AutoCloseable(或其子接口 Closeable)的类才能用于 try-with-resources。常见如:
-
FileInputStream/BufferedReader -
Connection、Statement、ResultSet(JDBC 4.0+) - 自定义类只需实现
void close() throws Exception方法即可
基本语法格式
资源声明写在 try 后的圆括号内,支持多个资源,用分号分隔:
try (FileInputStream fis = new FileInputStream("a.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fis))) {
String line = br.readLine();
System.out.println(line);
} // 编译器自动插入 finally 块,按逆序调用 br.close() → fis.close()
注意:资源变量是隐式 final 的,不可重新赋值;每个资源都会被独立关闭,即使前一个 close() 抛异常,后续资源仍会尝试关闭。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
异常处理与抑制异常(Suppressed Exceptions)
若 try 块抛出异常,且资源关闭时也抛异常,后者会被“抑制”并附加到主异常上:
- 主异常可通过
exception.getSuppressed()获取被抑制的异常数组 - 不会掩盖原始异常,保证调试信息完整
- 推荐在日志中检查
getSuppressed(),避免遗漏关闭失败问题
与传统 try-catch-finally 的对比优势
相比手动关闭:
- 代码更简短,逻辑聚焦业务,不分散在
finally中 - 避免因忘记关闭、
return提前退出或关闭时异常导致资源泄漏 - 多资源关闭顺序确定(逆序),符合依赖关系(如先关流,再关底层文件句柄)

















