Java 后端面试题库 / 全部题解免费阅读理解原理,有条理地回答

异常处理结束后,Exception 对象会怎样?

查看完整题解

参考回答

直接回答

异常处理结束后,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 题。

这道题,你掌握得怎么样?

掌握程度由你主动标记,阅读和收藏不会自动改变状态。