Java中的finalize方法引发的异常,Java文档中的矛盾?

时间:2017-01-23 21:05:13

标签: java exception finalize

我刚刚在Java 8 Docs中遇到了两个相互矛盾的句子,并想知道这里是否有人可以澄清真实的行为。

  

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

- >如果我说得对,“未捕获的异常”意味着它不会被try / catch - block捕获,而这与它是一个已检查或未经检查的异常无关。

  

“finalize方法抛出的任何异常都会导致暂停此对象的终结,但会被忽略。”

- >这恰恰是相反的行为......他们的意思是什么呢?“否则会被忽略”?如果它没有被finalize方法抛出......?

其他人提出类似的问题,例如other stackoverflow question,但答案是不可理解的。

我理解“暂停”暂停 - 或者它与终止一样?

顺便说一下: 我发现尝试依赖finalize实际上是不好的做法,因为无法保证它被调用(甚至System.gc()也没有强制它,只建议编译器需要进行垃圾收集)。有人建议使用关闭钩子:

FETCH_HEAD

e.g。这里stack overflow question

我仍然认为Java文档应该清晰,而不是陈述矛盾的真理...... 或者这是一个英语问题......?

1 个答案:

答案 0 :(得分:1)

第一句话在其词汇中具有误导性,但它们是相同的陈述。

一旦抛出异常,终结“终止”,意味着最终化没有正确完成。

与未捕获的异常可能导致整个程序崩溃的正常程序不同,如果finalize抛出异常,程序就会正常移动。