异常处理结束后,Exception 对象会怎样?
先说出你的答案
定义边界、关键机制、一个反例;P8题再补容量、失败与验证。
查看完整题解
参考回答
直接回答
异常处理结束后,Exception 对象不会被立即销毁。如果它不再通过任何强引用路径可达,就可能在之后被垃圾收集;如果仍被日志队列、缓存、其他异常的 cause 或业务对象引用,它就继续存活。是否进入过 catch,不决定它的生命周期。
讲清原理
异常对象也是普通 Java 对象。抛出和捕获改变的是程序的执行路径,不是另开一套对象回收规则。catch 中的局部变量离开作用域,只表示这个名字不能再使用;对象是否可回收,还要看其他地方有没有保存它。
异常还可能带着堆栈、原因链或被抑制异常。长期保存大量异常会占用内存,保存自定义异常时也要留意其字段是否引用了较大的业务数据。回收时机由具体运行环境决定,不应作为程序逻辑的依据。
例子与易错点
Exception saved;
try {
throw new Exception("读取失败");
} catch (Exception e) {
saved = e;
}
System.out.println(saved.getMessage()); // 读取失败
catch 已结束,saved 仍能访问异常对象。即使写成 saved = null,也只能移除这一条引用,不能命令 GC 立刻回收它。
相关题:第 8 题、第 52 题。
和评分标准对照,你能独立回答到哪一步?
自评会安排下一次复习,不保存你的口述内容。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。