Java中try-with-resources可自动关闭AutoCloseable资源,避免手动close和资源泄漏;声明需final、按逆序关闭、异常被抑制;支持标准IO类及自定义资源实现AutoCloseable接口。

Java 中用 try-with-resources 可以自动关闭实现了 AutoCloseable 接口的资源(比如 InputStream、OutputStream、Reader、Writer 等),避免手动调用 close(),也彻底规避了因忘记关闭或异常导致流未释放的问题。
基本写法:在 try 后面加小括号声明资源
资源必须是 final 或等效 final(即声明后不重新赋值),且类型需实现 AutoCloseable。JVM 会在 try 块结束时(无论正常还是异常)自动调用其 close() 方法。
- 语法简洁:不用写
finally块,也不用手动close() - 多个资源用分号隔开,关闭顺序与声明顺序相反(后声明的先关闭)
- 如果 close() 抛异常,会被抑制(suppressed),主异常仍会抛出,可通过
getSuppressed()获取
读文件示例:用 BufferedReader 一行行读取
以前要写 try-catch-finally,现在一行声明搞定:
(注意:路径用 Path.get() 更推荐,但 FileInputStream 也支持)try (FileInputStream fis = new FileInputStream("data.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(fis))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
System.err.println("读取失败:" + e.getMessage());
}
这里 reader 和 fis 都会在块结束时自动关闭,哪怕 readLine() 抛异常也一样。
立即学习“Java免费学习笔记(深入)”;
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
写文件示例:用 BufferedWriter 写入并确保换行
写操作同样适用,还能组合使用:
try (FileOutputStream fos = new FileOutputStream("output.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
BufferedWriter writer = new BufferedWriter(osw)) {
writer.write("Hello, try-with-resources!");
writer.newLine();
writer.write("第二行内容");
} catch (IOException e) {
System.err.println("写入失败:" + e.getMessage());
}
三个资源按 writer → osw → fos 逆序关闭,编码和换行都可控,代码干净无冗余。
自定义资源:让自己的类支持 try-with-resources
只要实现 AutoCloseable 接口,并重写 close() 方法即可:
class MyResource implements AutoCloseable {
public void doSomething() {
System.out.println("正在使用资源");
}
@Override
public void close() {
System.out.println("资源已释放");
}
}
然后就能这样用:
try (MyResource res = new MyResource()) {
res.doSomething();
} // 自动触发 close()
不复杂但容易忽略:只要资源类型合法、声明位置正确,try-with-resources 就能帮你扛住资源管理的大部分坑。

















