我刚刚在Java 8 Docs中遇到了两个相互矛盾的句子,并想知道这里是否有人可以澄清真实的行为。
“如果finalize方法抛出未捕获的异常,则忽略该异常并终止该对象的终止。”
- >如果我说得对,“未捕获的异常”意味着它不会被try / catch - block捕获,而这与它是一个已检查或未经检查的异常无关。
“finalize方法抛出的任何异常都会导致暂停此对象的终结,但会被忽略。”
- >这恰恰是相反的行为......他们的意思是什么呢?“否则会被忽略”?如果它没有被finalize方法抛出......?
其他人提出类似的问题,例如other stackoverflow question,但答案是不可理解的。
我理解“暂停”暂停 - 或者它与终止一样?
顺便说一下: 我发现尝试依赖finalize实际上是不好的做法,因为无法保证它被调用(甚至System.gc()也没有强制它,只建议编译器需要进行垃圾收集)。有人建议使用关闭钩子:
FETCH_HEAD
e.g。这里stack overflow question
我仍然认为Java文档应该清晰,而不是陈述矛盾的真理...... 或者这是一个英语问题......?
答案 0 :(得分:1)
第一句话在其词汇中具有误导性,但它们是相同的陈述。
一旦抛出异常,终结“终止”,意味着最终化没有正确完成。
与未捕获的异常可能导致整个程序崩溃的正常程序不同,如果finalize
抛出异常,程序就会正常移动。