维护对异常的引用以供以后使用是否合理,或者是否存在将异常引用保持比 throw/catch 交互更长的时间的陷阱?
例如,给定代码:
class Thing {
private MyException lastException = ...;
synchronized void doSomethingOrReportProblem() {
try {
doSomething();
} catch (MyException e) {
if (seemsLikeADifferentProblem(e, lastException)) {
reportProblem(e);
}
lastException = e;
}
}
}
假设我的程序创建了一个生命周期与 JVM 一样长的事物,那么在维护对 lastException 的挥之不去的引用的事物中是否存在任何正确性问题?这在JDK7中是否发生了变化?(查看 OpenJDK7 中 Throwable 的源代码,似乎有一个新的四参数公共构造函数,它不在 JDK6 中,它可以创建 Throwable 而无需在构造时调用 fillInStackTrace()。)
如果 MyException 下的任何链接异常都引用了对象,是的,这将阻止这些对象被垃圾收集,但假设我对此没问题,是否有任何陷阱需要提防?