Java中try-with-resources能自动关闭实现了AutoCloseable接口的资源,要求资源必须在try括号内声明并初始化,按逆序关闭,支持异常抑制机制。

Java 中 try-with-resources 能自动关闭实现了 Closeable(或 AutoCloseable)接口的对象,前提是该对象在 try 语句的括号中正确声明。
资源必须在 try 括号内声明
只有在 try 后面的圆括号中初始化并声明的资源,才会被自动关闭。编译器会确保这些资源在 try 块结束(无论正常结束还是抛出异常)时调用其 close() 方法。
- ✅ 正确写法:资源声明和初始化都在括号内
- ❌ 错误写法:先创建变量再放进 try 括号,或只声明不初始化
示例:
✔️ 正确try (FileInputStream fis = new FileInputStream("file.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(fis))) {
// 使用资源
} // 自动调用 reader.close() 和 fis.close()
关闭顺序是“后声明,先关闭”
多个资源用分号分隔时,JVM 按声明的**逆序**调用 close(),即最后声明的最先关闭。这通常符合依赖关系(比如外层流包装内层流),避免因底层资源提前关闭导致上层 close 失败。
立即学习“Java免费学习笔记(深入)”;
- 如上面例子中,
reader先关闭,再关闭fis - 若关闭过程中抛出异常,后续资源仍会继续关闭
资源类型必须实现 AutoCloseable 接口
try-with-resources 要求资源类型实现 java.lang.AutoCloseable(Closeable 是它的子接口)。常见类如 FileInputStream、BufferedReader、Connection、Statement 等都满足。
- 自定义类只需实现
AutoCloseable并提供close()方法即可被 try-with-resources 管理 - 注意:
close()方法应幂等(多次调用无副作用),且尽量不抛出检查异常(推荐声明throws Exception或捕获处理)
异常处理机制有特殊规则
如果 try 块和某个 close() 都抛出异常,try 块的异常会被抛出,而 close() 的异常会被抑制(suppressed),可通过 Throwable.getSuppressed() 获取。
- 不会因为 close 失败而掩盖主异常
- 可在 catch 块中打印被抑制的异常辅助排查


















