维护对异常的引用以供以后使用是否合理,或者是否存在使异常引用持续时间远远超过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下的任何链接异常都引用了对象,是的,这会阻止那些对象被垃圾收集,但假设我没关系,是否有任何陷阱需要注意?
Throwable 是一个成熟的 Java 对象,只要有人引用它,它就会持续存在。自从我进入 Throwable 以来已经有一段时间了,但我想不出它可能会保留对堆栈跟踪中方法的类(只是可能)以外的引用的任何内容。然而,堆栈跟踪本身确实消耗了大量的存储空间。
所以它实际上与任何其他中等大小的物体没有什么不同。在 JVM 的生命周期中保留一个异常似乎一点也不出格。(如果您保留所有异常的记录,这可能有点多。)