我们为什么要关闭java.util.Scanner变量?

时间:2014-07-04 11:16:13

标签: java

我在Eclipse中收到了一个警告,其中包含以下代码:

代码:

Scanner money = new Scanner(System.in);
System.out.println(money.nextLine());
//money.close();

警告:

Description Resource    Path    Location    Type
Resource leak: 'money' is never closed  apples.java /SwordsNMoney/src   line 6  Java P

这是什么警告以及资源泄漏'意思?

谢谢。

5 个答案:

答案 0 :(得分:5)

资源泄漏 通常是一种错误的资源消耗模式,程序不会释放它已获取的资源。这可能会导致服务质量下降。

垃圾收集只能管理内存,而不能管理其他系统资源。如果您的Java程序有足够的可用内存,则不会自动触发垃圾收集。

所有操作系统都对可以打开的套接字,文件句柄等数量有限制。因此,对非内存资源的引用的无意维护可能导致资源泄漏。因此,管理非内存资源非常重要。

利用非内存资源的类应提供显式分配/释放这些资源的方法。我们需要明确地调用close()方法来释放finally{}中的文件描述符,因为它将执行是否抛出异常。

答案 1 :(得分:2)

Scanner打开底层操作系统的文件描述符(或文件通道或流),通常以非托管(通常为C语言)编写。

流保持打开状态,有时可以保持打开状态,直到内核决定关闭它(例如,在程序完成执行后......依赖于高度实现)。

因此明确关闭资源是一个好主意。

答案 2 :(得分:2)

你需要致电'关闭'关于IO类。

您可以使用try catch并最终阻止,在finally块中,您可以关闭扫描仪。

来自docs

  

关闭

     

如果此扫描仪尚未关闭,则表明其底层   read也实现了Closeable接口,然后是可读的接口   将调用close方法。如果此扫描仪已经关闭,那么   调用此方法将无效。

答案 3 :(得分:1)

可能是,底层资源(即文件描述符(在本例中为System.in))永远不会被释放,因此如果不正确关闭它就会被阻止。

据我所知,Java有一些处理机制可以自动关闭打开的扫描仪。有人对此有更多了解吗?

答案 4 :(得分:1)

泄漏一般定义为不会被垃圾收集。例如线程泄漏,对象泄漏 - 在这种情况下,线程占用的内存,对象不会被垃圾收集。

这里你没有关闭货币参考变量。所以引用不会被释放。所以它被称为Reference泄漏。