如果在 finalize() 执行过程中抛出异常会发生什么?堆栈是否正常展开?它是否继续 finalize() 并忽略异常?它会停止 finalize() 并继续 GC 对象吗?或者是其他东西?
我不是在寻找使用 finalize() 的指南,有很多页面解释了这一点。
从Object#finalize() javadoc:
finalize 方法抛出的任何异常都会导致该对象的终结被暂停,否则会被忽略。
假设您有充分的理由编写终结器,编写终结器的正确方法是:
protected void finalize() throws Throwable
{
try
{
// my finalization code
}
finally
{
super.finalize();
}
}
如果抛出异常,则终止对 finalize 的调用,下次不会调用它,而是从内存中 GC-ed 对象。