【问题标题】:Java: impact of throwing an exception in finalize()Java:在 finalize() 中抛出异常的影响
【发布时间】:2020-05-22 15:14:50
【问题描述】:

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

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

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

【问题讨论】:

  • 是的,它会停止最终确定。
  • 谢谢,但在什么情况下会被忽略?该语句中的“但被忽略”是什么意思?
  • 参见The Java Tutorials 中的finalize() 方法 部分。无论如何你都不应该使用它。
  • @J.E.Y 这意味着它不会影响 JVM 或任何其他可终结的对象。实际上,他们是在说他们保证能抓住并吞下任何东西finalize throws。
  • 我的解释:它会停止实际的方法(或直到 finalize() 方法的方法链)但它不会对 JVM 产生任何影响(就像 JVM 正在做 try { obj.finalize(); } catch (Throwable ignored) { } )

标签: java exception finalize


【解决方案1】:

句子

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2016-08-10
    • 1970-01-01
    • 2014-04-13
    • 2020-06-08
    • 1970-01-01
    • 2013-05-29
    • 2012-07-23
    • 1970-01-01
    相关资源
    最近更新 更多