2016-04-04 63 views
-2

我是新手。我写了这段代码,它表明有资源泄漏那里Java中的资源泄漏警告

Scanner scan = new Scanner(System.in); 
    int i = scan.nextInt(); 

这是什么意思?对不起,天真。

+1

您永远不会关闭扫描仪,这样资源可能会“泄漏”。 – callyalater

回答

0

发生这种情况是因为您尚未关闭扫描仪。 Java垃圾收集器只管理内存,所以对于其他资源,您必须明确关闭它们。 使用

scan.close(); 

希望它有帮助!

0

Scanner实现了Closeable接口,这意味着它应该在某个时候关闭,这就是为什么你会收到警告。不过,我想你会发现你正在寻找的答案,比如这里:Close a Scanner linked to System.in

0

你永远关闭该资源的使用后,该医生说,该扫描仪必须接近

类实现接口java.io.Closeable(自JDK 1.5) 和java.lang.AutoCloseable(自JDK 1.7)被认为是 表示外部资源,这应该使用方法 接近()是封闭的,当它们没有更长的需要。

Eclipse Java编译器能够分析使用此类 类型的代码是否符合此策略。

...

编译器将标志[侵犯]与 “资源泄漏: '流' 永远不会关闭”。

1

发生的事情是,你永远不会关闭你的扫描仪,所以资源可能会“泄漏”。这意味着JVM在后台分配,释放和管理对象(资源),并且需要知道您的Scanner对象是否仍在使用,或者是否可以释放内存(执行“垃圾回收”)以使用为了别的东西。资源关闭时,让垃圾收集器知道可以清理这些资源。这就像打开了很多酸奶容器,让它们躺在房子周围。你还在吃吗?还是可以把它们放回冰箱?

有几个解决方案。其中一个是如其他答案中所述,在您的扫描仪上明确调用close()方法。但是还有另一种更简洁的方式来管理资源。

在Java 7中,引入了一个"try-with-resources"来自动关闭这样的资源,因为程序员通常忘记关闭资源。这使JVM可以更轻松地为您管理资源。

try(Scanner scan = new Scanner(System.in)) 
{ 
    int i = scan.nextInt(); 
} 
catch(Exception e) {} 
finally {} 

使用资源尝试的一个附加好处是它提醒程序员考虑所有可能发生的特殊情况。例如,如果用户在命令行中输入一个字符而不是int,会发生什么情况?如果处理中的某些内容抛出异常,并且您忘记关闭该执行分支上的Scanner,该怎么办?试用资源可以简化这一点,并使代码更加简洁和可读(如果使用得当的话)。