Java中自动关闭资源最推荐用try-with-resources:JDK7起支持,要求资源实现AutoCloseable接口,在try括号内声明初始化,多资源分号隔开、逆序关闭;JDK9+支持复用已声明变量。

Java 中自动关闭资源最推荐的方式就是用 try-with-resources,它从 JDK 7 开始支持,能确保实现了 AutoCloseable 接口的资源在使用后自动调用 close() 方法,无论代码是否抛异常。
资源声明必须在 try 括号里
所有要自动关闭的对象,必须在 try 后面的小括号中声明并初始化。不能写在外面再传进去(JDK 9+ 除外,见下文)。
- 每个资源变量是隐式
final的,不能在try块内重新赋值 - 资源类型必须实现
AutoCloseable或其子接口Closeable - 常见可直接用的类:
FileInputStream、BufferedReader、Connection、PreparedStatement、ResultSet等
多个资源用分号隔开,关闭顺序是逆序
多个资源写在同一对括号里,用分号分隔。JVM 会按“后声明、先关闭”的顺序执行 close(),也就是 LIFO(后进先出)。
- 例如:
try (A a = new A(); B b = new B()) { ... }→ 先关b,再关a - 这个顺序很重要:比如
BufferedInputStream包裹FileInputStream,就得后声明缓冲流,确保它先关,避免底层流提前关闭
异常处理:主异常优先,close 异常被抑制
如果 try 块里抛了异常,同时某个 close() 也抛异常,后者不会覆盖前者,而是作为“被抑制异常”附加到主异常上。
立即学习“Java免费学习笔记(深入)”;
- 主异常仍正常抛出,业务逻辑错误不会被掩盖
- 可通过
e.getSuppressed()获取被抑制的异常数组,方便排查资源清理问题 - 不建议在
close()中抛检查异常(如IOException),除非必要;否则可能干扰主流程异常传播
JDK 9+ 支持复用已有变量(更灵活)
Java 9 起允许把已声明的、非 final 的资源变量直接放进括号,不用重复声明类型和新建对象:
- 写法:
FileInputStream fis = new FileInputStream("a.txt"); try (fis) { ... } - 好处:避免重复创建、便于资源复用或条件初始化
- 注意:该变量在进入
try块前必须已初始化且不为null


















