首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >清理finalize()或finally()中的代码?

清理finalize()或finally()中的代码?
EN

Stack Overflow用户
提问于 2009-12-04 07:43:54
回答 9查看 5.2K关注 0票数 9

我一般认为清理资源是在finally块中完成的,

最近,我在一个类中发现了这个特殊的代码片段,它覆盖了Object类的finalize()方法。

代码语言:javascript
运行
复制
protected void finalize() {  
    try {
        In.close(); 
        Out.close();
        socket.close();
    }
    catch (Exception e) {
        //logger code here
    }
}

这是个好主意吗?相对于finallyfinalize()的优势和劣势是什么

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-12-04 07:46:17

finally块只是一个始终在try块之后执行的代码块,即使有异常也是如此。即它的作用域是局部的

finalize()方法是一种在对象被垃圾回收时清理整个对象的方法。

Java documentation of finalize()

finally解决了清理代码块中的资源而不管是否发生异常情况的问题……当您的对象不再被使用时,一旦垃圾收集器确定不再有对该对象的引用,finalize()就是一种清理资源的方法。

简而言之,为了回答您的问题,例如,如果您要关闭的套接字是某个对象的成员,那么您应该在finalize()方法中关闭它们(尽管这不是最优的,例如,因为不能保证GC何时会实际执行操作)。

但是,如果您在一个方法中打开套接字,并在该方法结束时使用它,那么您应该释放finally块中的资源。

票数 16
EN

Stack Overflow用户

发布于 2009-12-04 07:45:55

总是在最后把事情清理干净。

不能保证在finalize中进行清理。

然而,经常发现在finalizer中清理这类东西,作为最后一道安全阀,以防finally块向您抛出另一个异常。

依赖终结器的真正问题是,在GC调用终结器之前,其他东西可能需要资源。

票数 8
EN

Stack Overflow用户

发布于 2009-12-04 08:12:34

Phantom引用会做你想做的事情。

只是不要使用finalize。在一些边缘情况下,它可能会有帮助(当一个类被GC'd时打印调试信息是有用的),但通常不是这样的,JVM合同中甚至没有任何东西说它必须被调用。

有一种被称为“引用”的非常低调的对象类型。一种是显式地为您认为将使用finalize的东西创建的。

Phantom reference对象,在收集器确定其引用对象可能被回收后,将这些对象排入队列。

我突然想到一定有a description of this on the web--所以我将用这个引用替换我刚刚写的所有“如何操作”的东西。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1843905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档