try-with-resources 是最可靠简洁的资源管理方式,要求资源在 try 括号内声明初始化,按逆序自动关闭,仅支持实现 AutoCloseable 接口的类,异常时仍保证关闭且 close 异常被抑制。

用 try-with-resources 自动关闭,是最可靠、最简洁的方式。它从 Java 7 开始支持,能确保流资源在使用后必定释放,从根本上避免因遗漏或异常导致的内存泄漏。
必须在 try 括号里声明并初始化
资源对象不能提前声明再传入 try 块,否则不会被自动管理:
- ❌ 错误写法(不触发自动关闭):
FileInputStream fis = new FileInputStream("a.txt");
try { /* 使用 fis */ } catch (IOException e) { } - ✅ 正确写法(自动关闭):
try (FileInputStream fis = new FileInputStream("a.txt")) {
// 使用 fis
}
多个流按逆序自动关闭
声明顺序决定关闭顺序:后声明的先关,适合有依赖关系的嵌套流(比如 BufferedReader 包裹 FileInputStream):
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 示例:
try (FileInputStream fis = new FileInputStream("in.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(fis))) {
// 读取操作
} - 执行结束时,JVM 先调
reader.close(),再调fis.close()
不是所有类都默认支持
关键看是否实现 AutoCloseable 接口:
- ✅ 支持的常见类:
FileInputStream、FileOutputStream、BufferedWriter、Connection、PreparedStatement、ResultSet(JDBC 4.0+) - ❌ 不支持(Java 19 之前):
Scanner虽有close()方法,但未实现 AutoCloseable,不能直接用于 try-with-resources - 检查方法:
终端运行javap -s java.io.FileInputStream,确认签名含implements java.lang.AutoCloseable
异常处理更安全
即使 try 块抛出异常,所有资源仍会依次关闭;若 close() 本身也抛异常,它会被“抑制”(suppressed),主异常不受影响:
- 可通过
exception.getSuppressed()获取被抑制的异常 - 无需手动嵌套 try-catch 防止一个 close 失败中断后续关闭
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










