终结器不是析构函数,终结器是无用的。
据我所知,很多 Java 资源对象都在 finalize() 上“以防万一”。
这似乎是一种过于宽容的态度,可能会导致错误。
您至少要做的是 finalize 记录错误(在最终确定时未处置的资源)并将它们打印到标准输出然后处置。
一种更严格的态度可能是对例外情况进行处理。我不一定要实现这样的限制性资源对象,但我想知道如何去做。
但是在 Java 中,终结器中抛出的异常被忽略(然后对象被放回列表中以再次终结)。有没有办法实现这样的事情?如果创建对象的线程仍然存在(或者如果不存在,则可能是父线程?
还!!!!!其他 gc 语言(尤其是 C#、python 等)如何处理资源终结(它们通常是否为资源类实现“以防万一处置”?),从终结器中抛出,向其他线程提供例外。(注意:我不太关心使用/使用糖来调用 dispose 方法或接受自动关闭资源的闭包的方法,我对终结器所扮演的角色以及终结器的错误传播很感兴趣)。