Java 7起用try-with-resources自动关资源,JVM保证关闭;此前需手动在finally中判空调close,易漏关、嵌套深、异常覆盖。

Java 7 之前靠手动 + finally 关资源,之后用 try-with-resources 自动关——核心差别不在“要不要关”,而在“谁来保证一定关上”。
JDK 7 之前:关得辛苦,还容易漏
必须显式调用 close(),且要放在 finally 块里;但实际写起来很脆弱:
- 每个资源都要判空再关,否则可能 NPE
- 关闭本身可能抛异常,得再套一层 try-catch,嵌套越来越深
- 多个资源时,一个关失败可能跳过后续关闭(比如
br.close()报错后,fr.close()就不执行了) - 业务异常和关闭异常打架:finally 里抛的异常会覆盖 try 中的原始异常,排查困难
JDK 7 及之后:声明即托管,关得干净又可靠
只要资源实现 AutoCloseable(如 InputStream、Connection、Scanner 等),就能放进 try() 括号里,JVM 负责收尾:
将后端 Java 接口文档转换为前端 TypeScript 类型定义(interface / type)。输入:飞书文档、Spring Boot 接口文档、Swagger/OpenAPI、手写 API 文档等。输出:包含请求参数与响应结果的 .md 文件,含完整 JSDoc 注释。触发关键词:Java 转 TS、接口转换、生成前端类型、接口文档转 TypeScript、DTO/VO/BO 转 interface、后端文档转前端类型、生成接口类型、类型定义生成。
- 无需判空、无需 finally、无需手动 close(),代码行数直接砍半
- 即使 try 块中抛出异常,close() 仍会被调用
- 多个资源按声明逆序关闭(后声明的先关),天然适配依赖关系(比如 BufferedReader 依赖 FileInputStream)
- 关闭时若抛异常,会被“抑制”(suppressed),主异常保留,可通过
getSuppressed()查看,不丢失上下文
一个对比示例:读文件
传统写法(JDK 6 及以前):
立即学习“Java免费学习笔记(深入)”;
FileReader fr = null;
BufferedReader br = null;
try {
fr = new FileReader("a.txt");
br = new BufferedReader(fr);
br.readLine();
} catch (IOException e) {
// 处理业务异常
} finally {
if (br != null) try { br.close(); } catch (IOException ignored) {}
if (fr != null) try { fr.close(); } catch (IOException ignored) {}
}
现代写法(JDK 7+):
try (FileReader fr = new FileReader("a.txt");
BufferedReader br = new BufferedReader(fr)) {
br.readLine();
} catch (IOException e) {
// 只管业务异常,关闭全自动
}

















