java 7 之前必须用 try-catch-finally 手动管理资源:资源声明为 null、try 中初始化、finally 中判空并捕获 close() 异常;多资源需逐个判空关闭,须防 npe 和异常掩盖,关闭顺序需手动保障。

Java 7 之前没有 try-with-resources,只能靠 try-catch-finally 手动管理资源关闭,核心是确保 close() 在 finally 中执行,且要规避空指针和异常掩盖问题。
基本替代写法:显式声明 + finally 关闭
资源变量必须在 try 外声明为 null,并在 finally 中判空后调用 close():
- 声明资源引用为
null(如FileInputStream fis = null;) - 在 try 块中初始化资源
- 在 finally 块中检查非空,再调用
close(),并单独捕获关闭时的异常
多资源场景:嵌套或逐个判空
多个资源需分别声明、分别判空关闭,不能省略任一检查:
- 避免嵌套 try-finally(易失控),推荐扁平化处理
- 每个资源独立判空,例如:
if (in != null) in.close(); if (out != null) out.close(); - 关闭异常需单独捕获,否则可能吞掉原始异常
关键细节:防止异常掩盖与资源泄漏
传统方式最易出错的两点,必须主动防御:
-
原始异常不能被覆盖:
finally中的close()异常必须用独立catch捕获,不能向上抛出或忽略 -
空指针防护不可少:资源未成功创建时(如构造抛异常),引用仍为
null,直接调用close()会 NPE - 关闭顺序无自动保障:需开发者自行按依赖关系安排关闭次序(如先关子流,再关父流)
为什么 try-with-resources 是实质性升级
它不只是语法糖,而是从机制上解决了传统模式的固有缺陷:
- 编译器自动生成关闭逻辑,无需手写样板代码
- 关闭顺序严格按“后声明先关闭”,天然适配资源依赖链
- 关闭异常自动抑制(
addSuppressed),主异常始终可见 - 资源变量作用域受限,杜绝误用已关闭资源
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











