Java 中的 finalize 方法抛出的异常,Java 文档中的矛盾?
Exception thrown by finalize method in Java, contradiction in Java docs?
我刚刚在Java 8 Docs中看到两个相互矛盾的句子,想知道这里是否有人可以澄清真正的行为。
"If an uncaught exception is thrown by the finalize method, the exception is ignored and finalization of that object terminates."
-> 如果我没看错,"uncaught exception" 意味着它没有被 try/catch - 块捕获,这与它是已检查异常还是未检查异常无关。
"Any exception thrown by the finalize method causes the finalization of this object to be halted, but is otherwise ignored."
-> 这恰恰是相反的行为......它们对 "but is otherwise ignored" 意味着什么?如果它不是由 finalize 方法抛出...?
其他人问类似的问题,例如other Whosebug question,但是回答的不太明白。
我理解 "halted" 为暂停 - 或者它与终止相同?
顺便说一句:
我发现尝试依赖 finalize 实际上是一种不好的做法,因为不能保证它会被调用(即使 System.gc() 也不会强制它并且只建议编译器需要垃圾收集)。有些人建议改用关闭钩子:
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
// shutdown logic
}
});
例如这里stack overflow question
我仍然认为 Java 文档应该清楚,而不是陈述相互矛盾的事实....
或者这是英语语言问题...?
第一句在用词上有误导性,但它们是同一个陈述。
终结"terminates"一旦抛出异常,意味着终结没有正常完成。
与未捕获的异常可能导致整个程序崩溃的普通程序不同,如果 finalize
抛出异常,程序将照常运行。
我刚刚在Java 8 Docs中看到两个相互矛盾的句子,想知道这里是否有人可以澄清真正的行为。
"If an uncaught exception is thrown by the finalize method, the exception is ignored and finalization of that object terminates."
-> 如果我没看错,"uncaught exception" 意味着它没有被 try/catch - 块捕获,这与它是已检查异常还是未检查异常无关。
"Any exception thrown by the finalize method causes the finalization of this object to be halted, but is otherwise ignored."
-> 这恰恰是相反的行为......它们对 "but is otherwise ignored" 意味着什么?如果它不是由 finalize 方法抛出...?
其他人问类似的问题,例如other Whosebug question,但是回答的不太明白。
我理解 "halted" 为暂停 - 或者它与终止相同?
顺便说一句: 我发现尝试依赖 finalize 实际上是一种不好的做法,因为不能保证它会被调用(即使 System.gc() 也不会强制它并且只建议编译器需要垃圾收集)。有些人建议改用关闭钩子:
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
// shutdown logic
}
});
例如这里stack overflow question
我仍然认为 Java 文档应该清楚,而不是陈述相互矛盾的事实.... 或者这是英语语言问题...?
第一句在用词上有误导性,但它们是同一个陈述。
终结"terminates"一旦抛出异常,意味着终结没有正常完成。
与未捕获的异常可能导致整个程序崩溃的普通程序不同,如果 finalize
抛出异常,程序将照常运行。