期望java异常的合理寿命是多少?

Mic*_*lot 6 java exception

维护对异常的引用以供以后使用是否合理,或者是否存在使异常引用持续时间远远超过throw/catch交互的缺陷?

例如,给定代码:

class Thing {
  private MyException lastException = ...;
  synchronized void doSomethingOrReportProblem() {
    try {
      doSomething();
    } catch (MyException e) {
      if (seemsLikeADifferentProblem(e, lastException)) {
        reportProblem(e);
      }
      lastException = e;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

假设我的程序在JVM中创建了一个具有生命周期的东西,那么Thing是否存在与lastException保持延迟引用有关的任何正确性问题?在JDK7中,这一切都发生了变化吗?(在OpenJDK7中查看Throwable的源代码,看起来有一个新的四参数公共构造函数不在JDK6中,可以在构造时不创建一个Throwable而不调用fillInStackTrace().)

如果MyException下的任何链接异常都引用了对象,是的,这会阻止那些对象被垃圾收集,但假设我没关系,是否有任何陷阱需要注意?

Hot*_*cks 0

Throwable 是一个成熟的 Java 对象,只要有人引用它,它就会持续存在。自从我进入 Throwable 以来已经有一段时间了,但我想不出它可能会保留对堆栈跟踪中方法的类(只是可能)以外的引用的任何内容。然而,堆栈跟踪本身确实消耗了大量的存储空间。

所以它实际上与任何其他中等大小的物体没有什么不同。在 JVM 的生命周期中保留一个异常似乎一点也不出格。(如果您保留所有异常的记录,这可能有点多。)