为什么我要关闭java。util。扫描仪变量?
我在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
这个警告是什么?资源泄漏是什么意思
多谢各位
# 1 楼答案
Scanner
打开底层操作系统的文件描述符(或文件通道或流),该描述符通常用非托管(通常为C
语言)编写一个保持打开的流,有时可以一直保持打开状态,直到内核决定关闭它(比如,在程序完成执行之后……高度依赖于实现)
因此,显式关闭资源是一个好主意
# 2 楼答案
泄漏通常定义为未收集垃圾。例如线程泄漏、对象泄漏——在这种情况下,线程占用内存,对象不会被垃圾收集
在这里,您没有关闭货币参考变量。所以引用不会被释放。所以它被称为参考泄漏
# 3 楼答案
可能是,底层资源是一个文件描述符(在本例中是System.in),永远不会被释放,因此如果您没有正确关闭它,就会被阻止
据我所知,Java有一些处理机制来自动关闭打开的扫描仪。有人知道更多吗
# 4 楼答案
资源泄漏通常是一种错误的资源消耗模式,程序不释放它获取的资源。这可能导致糟糕的服务
垃圾收集只能管理内存,不能管理其他系统资源。如果Java程序有足够的可用内存,则不会自动触发垃圾收集
所有操作系统对可打开的套接字、文件句柄等的数量都有限制。因此,对非内存资源的引用的无意维护可能导致资源泄漏。因此,管理非内存资源非常重要
使用非内存资源的类应该提供显式分配/取消分配这些资源的方法。我们需要明确地调用
close()
方法来释放finally{}
中的文件描述符,因为无论是否引发异常,它都将执行强># 5 楼答案
您需要在IO类上调用“close”
可以使用try-catch和finally-block,在finally-block中可以关闭扫描仪
从docs