为什么Netbeans警告我最终确定?

时间:2014-12-03 11:36:22

标签: java netbeans java-7 finalize

我在Java7中实现了一个类。它不会继承/实现任何东西。它使用Tess4J所以我认为最终释放资源会很好。所以我像这样覆盖了finalize()方法:

@Override
protected void finalize() throws Throwable 
{
    try
    {
        TessAPI1.TessBaseAPIDelete(handle);
    }
    catch(Throwable t)
    {
        throw t;
    }
    finally
    {
        super.finalize();
    }
}

Netbeans 8.0.2告诉我这个方法的警告:

finalize declared()

Netbeans网站上的描述对我来说没什么用处:

warns about implementation of Object.finalize()

我没有覆盖任何其他方法,如平等或任何东西(也许我应该?)。 你能告诉我为什么会收到这个警告吗?

3 个答案:

答案 0 :(得分:4)

finalize方法存在的问题是它们可能在任意时间由任意线程调用,甚至根本不会调用。和discussed in this question一样,它们可能会很早就被调用,即当实例方法仍在执行时,因此使用它们来释放资源是非常危险的。

因此,如果它们对于它们的最初目的并不是真正有用,那么在使用它们时始终发出警告是合法的。


如果要实现清理资源的代码,当客户端代码忘记调用closedispose或您为显式资源管理提供的任何内容时(如果存在关联的本机,则应该这样做)资源)可以使用PhantomReference到实例和ReferenceQueue

来完成

优点是您可以控制何时轮询队列并执行清理,甚至可以通过让PhantomReference超出范围来选择退出事后清理(通常会收集它)如果客户端代码,则忘记致电close(强烈建议您实施AutoClosable以允许使用try with resources”),并且不加入队列。因此,这也解决了一个小的性能问题,即必须收集具有非平凡finalize方法的对象,因为执行finalize方法意味着它们再次可以访问。

答案 1 :(得分:2)

一般来说,大多数Java程序员从来没有理由实现finalize(),因为他们自己的代码只使用已经管理的类(因此有自己的终结器)。 (见问题下面的评论)。

有些开发人员可能不知道垃圾收集器是如何工作的,因此依赖于finalize()来完成应该在其他地方完成的清理工作。这种错误尤其会导致在测试中不被注意的缺陷,但会导致生产失败。

出于这个原因,我认为关于finalize()的警告是恰当的。

答案 2 :(得分:0)

当jvm转到gc时,调用

finalize()。所以资源可能没有按你的意愿发布。

最后使用try。