Java:在finalize()中抛出异常的影响

标签 java exception finalize

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

Any exception thrown by the finalize method causes the finalization of this object to be halted, but is otherwise ignored.

finalize() 抛出的异常是否会对对象的终结产生影响?

最佳答案

这句话

Any exception thrown by the finalize method causes the finalization of this object to be halted, but is otherwise ignored.

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

If an uncaught exception is thrown by the finalize method, the exception is ignored and finalization of that object terminates.

所以,这只是关于未捕获的异常,而不是关于在 finalize() 中抛出和捕获的异常或由 finalize() 调用的方法。另外“暂停”的意思是“终止”,而不是暂停或阻止。

考虑到“对象的终结”意味着“调用其 finalize() 方法”,而不是回收对象的内存,完全独立于对象的内存。因此终止终结并不是一个令人惊讶的行为,因为未捕获的异常总是会终止当前方法的执行。 “Otherwise”的意思是“除了终止当前的终结之外”,表示没有其他副作用,例如没有日志记录,也不影响其他对象的最终确定。

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

关于Java:在finalize()中抛出异常的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60097271/

相关文章:

java - Wildfly 10.1.0.FINAL 上的内存泄漏 (java.lang.ref.Finalizer/ActiveMQConnection)

.net - .net 中的 finalize 和 dispose 有什么区别?

java - 如何确定哪个接口(interface)属于每个网络目标 - Java?

PHP(或其他): Strategy to deal with exceptions that "cannot occur"

exception - Jersey ExceptionMapper 和继承

c# - 记录致命异常

java - 当您将变量绑定(bind)到某些数据时会发生什么?

java - 在Java中定义常量字符串?

java - Wicket - 通过 LoginPage 传递页面参数

python - IronPython - sys.exit() 上的正确资源释放