try-with-resources能自动关闭实现autocloseable的资源,需在try()中直接声明初始化,支持多资源逆序关闭,异常时仅抛出最后一个close异常,自定义资源也需实现autocloseable。

在 Java 中,try-with-resources 是处理资源流(如文件、网络连接等)最安全、简洁的方式,它能确保资源在使用完毕后自动关闭,即使发生异常也不会遗漏。在 main 方法中使用它,和在其他方法中一样,只需让资源对象实现 AutoCloseable 接口(几乎所有标准 I/O 流都满足)。
资源必须声明在 try 括号内
只有在 try 后的圆括号中声明并初始化的资源,才会被自动关闭。不能先声明变量再赋值,否则编译不通过。
- ✅ 正确写法:资源直接在 try() 中创建并赋值
- ❌ 错误写法:
FileInputStream fis; try { fis = new FileInputStream("a.txt"); ... }—— 这样不会自动关闭
支持多个资源,按声明逆序关闭
可以在同一 try() 中声明多个资源,用分号隔开。JVM 会按声明顺序的**反向**依次调用 close(),这很重要——比如输出流依赖输入流时,先关输出更安全。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 例如同时打开
FileInputStream和BufferedOutputStream,后者会在前者之后关闭 - 所有资源无论是否抛出异常,都会尝试关闭;若多个 close() 抛异常,仅最后一个异常会被抛出,其余被抑制(可通过
getSuppressed()获取)
main 方法中典型用法示例
以下代码读取一个文本文件并打印内容,全程无需手动调用 close():
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("input.txt");
InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);
BufferedReader br = new BufferedReader(isr)) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
System.err.println("读取文件失败:" + e.getMessage());
}
}
注意:嵌套流(如 BufferedReader 包装 InputStreamReader)也需单独声明,才能保证每层都被正确关闭。
自定义资源类也要实现 AutoCloseable
如果自己封装了需要清理的资源(如数据库连接、临时文件句柄),只要实现 AutoCloseable 并重写 close() 方法,就能被 try-with-resources 管理。
- 接口只有一个方法:
void close() throws Exception - 建议在
close()中加入判空和异常捕获,避免因单个资源关闭失败影响其他资源释放
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










