try-with-resources 不能与传统 try 嵌套,但可与 catch、finally 共存于同一 try 语句中,语法为 try(Resource) {...} catch(...) {...} finally {...},资源在 try 结束后、catch/finally 执行前自动关闭,关闭异常会被抑制并可通过 getSuppressed() 获取,finally 中不应手动 close 已管理资源。

Java 中 try-with-resources 本身已经隐含了资源自动关闭逻辑,它**不能直接与传统的 try 块嵌套使用**,但可以和 catch、finally 同时出现在同一个 try 语句中——也就是说,try-with-resources 就是那个 try,后面可以跟 catch 和/或 finally。
语法结构是固定的
必须写成:try (ResourceDeclaration) { ... } catch (...) { ... } finally { ... }
其中 try 后面的括号里声明资源,catch 和 finally 是可选的,顺序固定(catch 在前,finally 在后),不能颠倒,也不能省略 try 主体块。
资源关闭时机不受 catch/finally 干扰
资源会在 try 块结束时(无论正常结束、抛异常、还是执行到 return)自动关闭,这个过程发生在:
- 所有
try块代码执行完之后 - 但在任何
catch或finally执行之前 - 即使
try中抛出异常,资源仍会先关闭,再把异常(或压制异常)传递给catch
异常处理要注意“抑制异常”(Suppressed Exception)
如果 try 块中抛出异常,且资源关闭时也抛出异常,后者会被“抑制”,并添加到主异常的 suppressed 列表中:
- 主异常(
try块抛出的)会被catch捕获 - 被抑制的异常可通过
exception.getSuppressed()获取 - 常见于多个资源关闭失败,或
close()方法本身抛异常
finally 中不要手动 close 资源
因为资源已由 try-with-resources 自动管理:
立即学习“Java免费学习笔记(深入)”;
- 在
finally里调用close()属于重复操作,可能引发IllegalStateException或 NPE - 如果真要执行清理逻辑(比如重置状态、记录日志),确保不涉及已关闭资源的操作
- 例如:文件流已关闭,不能再读写;数据库连接已释放,不能再提交事务
不复杂但容易忽略。


















