java中try-with-resources是自动关闭资源最安全简洁的方式,要求资源实现autocloseable接口,jvm在try块结束时自动调用close(),支持多资源按逆序关闭,并妥善处理关闭异常。

Java 中用 try-with-resources 语句自动关闭流,是最安全、最简洁的方式。它能确保无论是否发生异常,资源都会被正确关闭,避免内存泄漏或文件句柄泄露。
什么是 try-with-resources
这是 Java 7 引入的语法糖,要求资源必须实现 AutoCloseable 接口(InputStream、OutputStream、Reader、Writer、Connection 等都实现了)。JVM 会在 try 块结束时自动调用 close() 方法,哪怕中途抛出异常也不会跳过关闭步骤。
- 资源在小括号中声明,格式为:
try (ResourceType resource = new ResourceType()) { ... } - 可以同时管理多个资源,用分号隔开
- 资源按声明顺序的逆序关闭(后声明的先关闭),符合依赖关系逻辑
基本写法示例
读取文件并自动关闭输入流:
try (FileInputStream fis = new FileInputStream("data.txt");
BufferedInputStream bis = new BufferedInputStream(fis)) {
int data;
while ((data = bis.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}
这里 bis 和 fis 都会被自动关闭,无需手动写 finally 块或 close() 调用。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
注意 close() 的执行时机和异常处理
如果 try 块中抛出异常,且 close() 也抛出异常,后者不会覆盖主异常,而是作为 suppressed exception(被抑制的异常)附加到主异常上。
- 可通过
exception.getSuppressed()获取被抑制的异常 - 通常只需关注主异常;若需排查关闭失败,再检查 suppressed 异常
- 不建议在资源声明中调用可能抛异常的方法(如 new FileInputStream 可能抛 FileNotFoundException),应放在 try 块内或由调用方处理
自定义资源类支持自动关闭
只要实现 AutoCloseable 接口,并重写 close() 方法即可:
public class MyResource implements AutoCloseable {
@Override
public void close() throws Exception {
System.out.println("MyResource 已关闭");
}
}
// 使用方式
try (MyResource r = new MyResource()) {
System.out.println("正在使用资源");
}
这样也能被 try-with-resources 正确管理。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










