我是新手。我写了这段代码,它表明那里有资源泄漏
Scanner scan = new Scanner(System.in);
int i = scan.nextInt();
这是什么意思?抱歉天真。
答案 0 :(得分: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
,会发生什么?如果您的处理中的某些内容引发异常并且您忘记关闭执行分支上的扫描程序,该怎么办? try-with-resources可以简化这一过程,使代码更简洁,更易读(如果使用得当)。
答案 1 :(得分:0)
发生这种情况是因为您尚未关闭扫描仪。 Java垃圾收集器只管理内存,因此对于其他资源,您必须显式关闭它们。 使用
scan.close();
希望它有所帮助!!
答案 2 :(得分:0)
Scanner
实现了Closeable
接口,这意味着它应该在某个时候关闭,这就是你收到警告的原因。但我认为你会找到你想要的答案,例如:Close a Scanner linked to System.in
答案 3 :(得分:0)
使用它后,你永远不会关闭该资源,文档说扫描仪必须关闭
实现接口 java.io.Closeable 的类(自JDK 1.5起) 和 java.lang.AutoCloseable (因为JDK 1.7)被认为是 表示外部资源,应使用方法关闭 close(),当它们不再需要时。
Eclipse Java编译器能够分析代码是否使用此类代码 类型符合此政策。
...
编译器将使用"资源泄漏标记[违规]:' stream'永远不会关闭"。