java - Java中finalize方法抛出异常,Java文档中矛盾?

标签 java exception finalize

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

"If an uncaught exception is thrown by the finalize method, the exception is ignored and finalization of that object terminates."

-> 如果我没理解错的话,“未捕获的异常”意味着它没有被 try/catch block 捕获,这与它是检查异常还是未检查异常无关。

"Any exception thrown by the finalize method causes the finalization of this object to be halted, but is otherwise ignored."

-> 这完全是相反的行为......“但否则会被忽略”是什么意思?如果不是由finalize方法抛出的...?

其他人也提出类似的问题,例如other stackoverflow question ,但答案无法理解。

我将“停止”理解为暂停 - 或者它与终止是一样的吗?

顺便说一下: 我发现尝试依赖 Finalize 实际上是不好的做法,因为不能保证它会被调用(即使 System.gc() 也不强制它,只是建议编译器需要垃圾收集)。有些人建议使用关闭 Hook :

Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() {
        // shutdown logic
    }
});

例如在这里stack overflow question

不过我认为 Java 文档应该是清晰的,而不是陈述矛盾的事实...... 或者这是英语语言问题...?

最佳答案

第一句话的措辞有误导性,但它们是相同的陈述。

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

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

关于java - Java中finalize方法抛出异常,Java文档中矛盾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41815611/

相关文章:

java - spring中如何定义Map值的序列

c - main() 在运行时异常时返回什么?

c++ - 嵌套的 catch 运算符

c++ - 处理失败的构造函数

java - 当GC可以释放所有连接时,为什么需要finalize

java - finalize()之后可以调用其他方法吗?

java - finalize() 在 Java 8 中调用强可达对象

java - 无法从客户端 x509 证书中检索主体

java urlconnection 不抛出 sockettimeoutexception

java - 在单个小程序中显示多个图像