不会。资源按声明顺序初始化,任一资源构造异常时,后续资源不创建且不关闭;已成功初始化的资源会按逆序自动关闭,确保仅对已获取资源执行清理,符合最小职责原则。

不会。第一个资源初始化失败时,后续资源根本不会被创建,也就谈不上“关闭”。
资源初始化失败时的执行逻辑
try-with-resources 的资源是按声明顺序依次初始化的。一旦某个资源的构造过程抛出异常(比如 FileNotFoundException),JVM 会立即中断初始化流程,跳过其后所有资源的声明和构造,直接进入 catch 块(或向上传播异常)。
这意味着:只有成功完成构造的资源,才会被纳入自动关闭管理范围;未走到那一步的资源,连对象实例都没产生,自然无需也不可关闭。
已成功初始化的资源仍会被关闭
如果前几个资源初始化成功,第 N 个失败,那么前 N−1 个已创建的资源,会在异常抛出前被按逆序自动关闭。
- 例如:
try (A a = new A(); B b = new B(); C c = new C()) { ... } - 若 B 的构造抛异常,则 A 已创建,C 未创建;此时 A 会被关闭,C 不参与任何关闭动作
为什么设计成这样?
这是为保障资源生命周期的确定性。初始化失败通常意味着资源获取条件不满足(如文件不存在、端口被占用),继续尝试创建后续资源既无意义,也可能引发无关错误。JVM 只对“已成功获得”的资源负责清理,符合最小职责原则。
验证方式
可在自定义资源类的构造方法和 close() 中添加日志,观察实际执行顺序。编译后反编译字节码也能看到:编译器生成的 finally 块中,只对已赋值的局部变量调用 close()。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











