Java 如何从终结器中抛出(资源对象)

Java 如何从终结器中抛出(资源对象),java,exception,language-agnostic,finalizer,resource-disposal,Java,Exception,Language Agnostic,Finalizer,Resource Disposal,终结器不是析构函数,终结器是无用的。 据我所知,很多Java资源对象都是在finalize()上处理的,“以防万一”。 这似乎是一种过于宽容的态度,可能会导致错误。 您最不希望做的就是finalize记录错误(在finalize时未处理的资源),并将它们打印到standard out,然后进行处理。 一种更严格的态度可能是采取例外。 我不一定要实现这样的限制性资源对象,但我想知道如何实现它 但在Java中,终结器中抛出的异常会被忽略(然后将对象放回列表以再次终结)。有没有办法实现这样的东西?如果

终结器不是析构函数,终结器是无用的。

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

您最不希望做的就是finalize记录错误(在finalize时未处理的资源),并将它们打印到standard out,然后进行处理。
一种更严格的态度可能是采取例外。 我不一定要实现这样的限制性资源对象,但我想知道如何实现它

但在Java中,终结器中抛出的异常会被忽略(然后将对象放回列表以再次终结)。有没有办法实现这样的东西?如果终结器中仍然存在异常(或者如果不存在,则可能是父线程),那么可以从终结器中为创建该对象的线程提供一种异常


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

应该使用它的唯一原因是为了谨慎地处理资源,例如InputStream的方法会导致close(),现在可能永远也不会调用它。另一种情况是,必须使用它的时候是使用native的。 令人遗憾的是,在其他情况下,没有人应该这样做

现在,您希望实现上述功能的问题是:存在一个具有finalize()方法的对象。现在,当没有对该对象的强引用时,它将被发送进行垃圾收集。现在,它从其条目表检查该特定对象是否具有finalize()方法(最初创建对象时注意到了这一点)。现在,当终结器线程运行finalize()方法时,此方法中有一段代码,最终导致此方法具有强引用

下次调用同一对象进行垃圾收集时,此对象不会第二次发送到终结器队列(默认情况下,没有对象可以多次转到终结器队列),因此不会第二次调用finalize()方法。这可能会导致巨大的问题


因此,如果要处理某些事情,请确保在finalize()方法之外执行,而不是在finalize()中执行由于它只会导致问题,而没有其他任何问题

在专用线程中调用finalizer,因此抛出异常或错误不会产生任何效果,因为您无法捕获代码或某个线程中的异常


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

并且thread propogate一个异常来分配线程?你能说得更具体一点吗?如果你想有一个块,其他线程可以引用这个线程?这绝对是非常危险的,原因与前面解释的相同,或者有其他类似于t close()或dispose()的方法方法,用于处理资源等。顺便说一下:上述终结器的两种合法用法也可以在有效的Java中读取,第7项:避免终结器。您可以调用
System.exit(-1)
如果这是你想要的。崩溃很少是最好的选择。是的,我不想崩溃。我只是希望有可能传播异常,以便它在回溯中崩溃,如果并且仅当!如果它没有被处理,它也不会被抛出,除非在垃圾收集时间之前没有处理对象。我不清楚y在哪里您希望将这些异常传播到。如果在终结器中无法执行此操作,您会得到什么好处?在终结器之前不进行处理可能是一个错误,我希望发出错误发生的信号。我记录了一个错误,即本应关闭的组件被丢弃(以及有关该组件的详细信息).我看不出把事情弄得更复杂有什么好处。