首页 > 解决方案 > Java:在 finalize() 中抛出异常的影响

问题描述

我对 Object#finalize() 的 Java Doc 中的这个语句感到困惑:

finalize 方法抛出的任何异常都会导致该对象的终结被暂停,否则会被忽略。

抛出的异常是否finalize()会影响对象的最终确定?

标签: javaexceptionfinalize

解决方案


这句话

finalize 方法抛出的任何异常都会导致该对象的终结被暂停,否则会被忽略。

确实是误导。奇怪的是,在同一文档中,在它之前不久,有一个更精确的句子:

如果 finalize 方法抛出未捕获的异常,则忽略该异常并终止该对象的终结。

所以,这只是关于未捕获的异常,而不是关于抛出和捕获的异常finalize()或调用的方法finalize()。进一步的“暂停”意味着“终止”,而不是暂停或阻止。

当考虑到“<em>对象的最终化”意味着“<em>调用其finalize()方法”时,它变得更加清晰,而不是完全独立于对象内存的回收。所以终止终结并不是一个令人惊讶的行为,因为未捕获的异常总是终止当前方法的执行。“否则”的意思是“除了终止当前的终结”,表示没有其他副作用,例如没有记录,对其他对象的终结没有影响。

这不同于例如在finalize()方法中具有无限循环。这可能确实会阻塞专用线程,从而阻止其他对象的终结。


推荐阅读