java - Java:在 finalize() 中抛出异常的影响
问题描述
我对 Object#finalize() 的 Java Doc 中的这个语句感到困惑:
finalize 方法抛出的任何异常都会导致该对象的终结被暂停,否则会被忽略。
抛出的异常是否finalize()
会影响对象的最终确定?
解决方案
这句话
finalize 方法抛出的任何异常都会导致该对象的终结被暂停,否则会被忽略。
确实是误导。奇怪的是,在同一文档中,在它之前不久,有一个更精确的句子:
如果 finalize 方法抛出未捕获的异常,则忽略该异常并终止该对象的终结。
所以,这只是关于未捕获的异常,而不是关于抛出和捕获的异常finalize()
或调用的方法finalize()
。进一步的“暂停”意味着“终止”,而不是暂停或阻止。
当考虑到“<em>对象的最终化”意味着“<em>调用其finalize()
方法”时,它变得更加清晰,而不是完全独立于对象内存的回收。所以终止终结并不是一个令人惊讶的行为,因为未捕获的异常总是终止当前方法的执行。“否则”的意思是“除了终止当前的终结”,表示没有其他副作用,例如没有记录,对其他对象的终结没有影响。
这不同于例如在finalize()
方法中具有无限循环。这可能确实会阻塞专用线程,从而阻止其他对象的终结。
推荐阅读
- python - Pandas 列到行转换
- docker - Traefik 反向代理 Ubooquity 失败
- docker - 浏览器未在 Selenoid [Capybara, Rspec] 中启动
- scala - 字符串列包含通过 spark scala 精确匹配的单词
- python - 在 pycharm IDE 中使用 pytest 时,我看不到运行按钮
- python - 在服务器 discord.py 之外对某人进行 Dming
- c# - 如何在 Visual Studio 2017 中启用断点
- javascript - 如何更新设置状态的对象数组
- azure - Azure 函数运行时未启动
- azure - 查询 Cosmos gremlin Graph 时,通过边连接的顶点的分区键不可用