try-with-resources:关闭资源也属于控制流程
读取文件成功后,异常可能发生在解析阶段。把 close 放在最后一行,无法保证异常路径执行到那里。
▶ 本文含视频讲解▶ 教学视频手动播放 · 英语讲解
Java Full Course
Java 基础课程作为语言背景复习;本文的特定 API、版本行为和边界条件以正文及文档为准。此为外部原版课程,多篇笔记可能共用;未剪辑为本文专属视频。
播放器需要能访问 YouTube 的网络;若这里无法加载,可打开原视频。本文与本地图解仍可独立阅读。
问题从哪里出现
读取文件成功后,异常可能发生在解析阶段。把 close 放在最后一行,无法保证异常路径执行到那里。
理解核心机制
实现 AutoCloseable 的资源可以由 try-with-resources 管理。资源按声明顺序的逆序关闭;若主体和关闭都抛出异常,关闭异常通常被保留为 suppressed,而不是悄悄覆盖最初的问题。
动手做一个小实验
Java 17 或更新版本;将示例保存为 Demo.java,执行 javac Demo.java 后运行 java Demo。
public class Demo {
static class Resource implements AutoCloseable {
public void close() { System.out.println("closed"); }
String read() { return "value"; }
}
public static void main(String[] args) {
try (var resource = new Resource()) {
System.out.println(resource.read());
}
}
}适用边界与常见误区
关闭不等于业务提交。数据库事务通常还需要明确 commit 或 rollback,连接池里的 close 也可能表示归还连接而非真正关闭网络连接。
继续练习
让 read 和 close 同时抛异常,查看主异常与 getSuppressed;借此确认你的日志是否记录了完整信息。