为什么我需要调用close()或shutdown()方法?

use*_*570 5 java garbage-collection shutdown finalize

我是Java新手,在高中时期有一些C++背景.现在我正在努力创造一些东西,我选择Java作为编程语言.

我完成了我的作业,看了很多关于Java的"析构函数",finalize()方法和close()shutdown()方法.但我仍然认为我不知道这应该如何工作(当然下面有更多信息)

好的,具体的问题是为什么我需要调用close()shutdown()方法?

在我的特定情况下,我正在使用一个我没有开发处理智能卡读卡器的类,但我已经看到文件管理的情况,你必须调用close()方法,将类似.

不是调用close()方法与在C++中释放内存的想法相同(那很糟糕)?意思是,我必须处理对象的删除或破坏......不是GC的用途吗?

我试图用于智能卡读卡器的类不是最好的选项可能是一个选项,这个类实现finalize()方法可能更好,所以当不再使用并准备好GC时,释放内存(很可能是本机代码)和/或释放GC可能不知道如何操作的硬件资源.

但是文件管理类呢?那些是非常常用和维护的,为什么仍然需要close()方法?我理解存在的目的,解锁文件,但为什么我要记得关闭它?一旦不再使用该对象,则至少在最常见的情况下自动解锁文件.

最后,使用实现finalize()方法的类来包装需要关闭或关闭的类是否是一个正确的解决方法,我调用close()shutdown()方法?

我已经看到finalize()方法不是很受欢迎,所以这就是我问这个问题应该如何解决的原因.

提前致谢

胡安

PS:我见过的:

是否有Java的析构函数?

你为什么要实现finalize()?

http://www.codeguru.com/java/tij/tij0051.shtml

用Layman的术语解释Java中的close()方法

我需要关闭我执行File.getName()的文件吗?

Zim*_*oot 3

大多数类会在其方法中清理其外部资源finalize,但这与 C++ 的析构函数不同 - 一旦不再使用对象,就会调用析构函数,但直到对象被垃圾收集后才会调用终结器,并且您不知道这种情况何时会发生(如果您没有内存密集型程序,则可能永远不会发生)。假设您正在分配一堆对象,每个对象都分配一个数据库连接(是的,您应该使用连接池,但这是一个假设);您使用每个对象,然后将其引用清空,以便可以在不先关闭其数据库连接的情况下对其进行垃圾收集,现在您的数据库将因为打开的连接太多而对您造成困扰。您可以调用System.gc,希望这会清理连接,但这只是对垃圾收集器执行收集的建议,并且您的垃圾数据库连接的终结器可能不够智能,无法完全清理连接。

长话短说,您需要调用closeandshutdown因为您不知道对象的终结器是否/何时运行,并且您不知道它们在清理外部资源方面有多好。

顺便说一句,您应该使用 try-catch-finally 块来确保调用closeshutdown- 将方法放入 finally 块中。或者,如果您使用的是 Java7,请使用 try-with-resources。

  • 我在一家公司工作,该公司会在对象终结器中清理数据库连接等,但终结器也会将其记录为警告,例如`if(!connection.isClosed) {connection.close(); log.warn("在终结器中关闭连接,这是一件坏事"); } (2认同)