java - 如何从(资源对象的)终结器中抛出

标签 java exception language-agnostic finalizer resource-disposal

终结器不是析构器,终结器没有用。

据我所知,很多 Java 资源对象都在 finalize() 上“以防万一”。
这似乎是一种过于宽容的态度,可能会导致错误。

您至少要做的是让 finalize 记录错误(在完成时未处理的资源)并将它们打印到标准输出,然后处理。
一种更严格的态度可能是抛出异常。 我不一定要实现此类限制性资源对象,但我想知道如何实现。

但在 Java 中,终结器中抛出的异常会被忽略(除了将对象放回列表中以再次终结)。有没有办法实现这样的事情?如果创建对象的线程仍然存在(或者如果不存在,则可能是父线程),也许可以为创建对象的线程提供终结器的异常?

还有!!!!!!其他 gc 语言(尤其是 C#、python 等)如何处理资源终结(它们通常是否为资源类实现“以防万一处置”?),从终结器中抛出,为其他线程提供豁免。 (注意:我不太关心使用/使用 sugar 来调用 dispose 方法或接受自动关闭资源的闭包的方法,我对终结器扮演什么角色以及终结器的错误传播很感兴趣)。

最佳答案

终结器在专用线程中调用,因此抛出异常或错误不会有任何效果,因为您无法在代码或线程之一中捕获异常。

如果你想将异常传递给另一个线程,你可以通过多种方式来实现。但是我不清楚你会在另一个线程中做什么,你会在当前线程中做什么。即,当您可以让当前线程记录一条消息时,为什么要创建一个异常传递给另一个线程以变成日志消息。

关于java - 如何从(资源对象的)终结器中抛出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7371109/

相关文章:

Java 泛型 : Multiple Inheritance in Bounded Type Parameters <T extends A & I>

ios - 如何在 Objective-C 中使用 Swift 文件?

python - 用 Python 读取文本文件并从中选择类别

language-agnostic - 为什么散列函数应该使用质数模数?

sql - 填充槽的算法

java - 具有圆心、半径和法 vector 的圆圆周上的 3d 点

java - 从 Java 代码访问 Scala 类型类?

java - 在 Java 中对资源使用 try 是否安全 - 它是否检查 closeable 是否不为 null 并在尝试关闭它时是否捕获异常

Java:带有子字符串的 NullPointerException

unit-testing - 测试......专业人士是如何做的,哪些技术可以扩展到单人开发?