晚上全部。我是使用Java编程的完全初学者,我正在学习“扫描程序”,但是当我在Eclipse中输入这个基本代码时,我收到一条消息“资源泄漏:'扫描程序'永远不会关闭。
我做错了什么?
package inputting;
import java.util.Scanner;
public class Input {
public static void main(String args[]) {
Scanner scanner = new Scanner(System.in);
System.out.println(scanner.nextLine());
}
}
答案 0 :(得分:4)
使用scanner
完成后,您必须使用close
方法关闭:
scanner.close();
您必须关闭它的原因是因为Scanner
类实现了Closeable接口。直接来自API:
可关闭是可以关闭的数据的来源或目标。该 调用close方法以释放对象所在的资源 持有(例如打开文件)。
基本上,如果你从未关闭Scanner
,那么程序将继续寻求输入并保持资源。这是一个真正的simple example:
Scanner scanner = null;
try {
scanner = new Scanner(System.in);
while (scanner.hasNext()) {
System.out.println(scanner.next());
//do whatever you need here
}
} finally {
if (scanner != null) {
scanner.close();
}
}
详细了解API中的Scanner
。
答案 1 :(得分:2)
因为您无法关闭扫描仪。这是问题(处理I / O的类应该在完成后关闭)。你需要关闭它:
scanner.close();
所以整个代码看起来像:
Scanner scanner = new Scanner(System.in);
try {
// work
}
finally {
if (scanner != null) {
scanner.close();
}
}
答案 2 :(得分:1)
这个问题有几个月了,但我想补充一点:没有理由关闭System.in
(关闭扫描仪会做什么),你可能不应该这样做。这是与automated warning Eclipse is giving和Closeable相关的AutoCloseable,如果基础资源为System.in
,System.out
或System.err
,则可以忽略。
对于任何其他资源,已经显示了“正确的”习惯用法(以确保即使抛出异常也会关闭资源)。
Pre Java 7:
Scanner scanner = null;
try {
scanner = new Scanner(new FileInputStream("some/file"));
// statements that throw exceptions
} finally {
if(scanner != null)
scanner.close(); // also closes the FileInputStream
}
发布Java 7:
try(Scanner scanner = new Scanner(new FileInputStream("some/file"))) {
// statements that throw exceptions
}
另请参阅"Why don't we close System.out
Stream after using it?" System.in
也是如此:您不应关闭未打开的资源,并且当流程终止时,VM将处理该资源。
答案 3 :(得分:0)
您已使用扫描仪获取输入。使用它之后,我们应该通过以下方式终止:
input_name.close();
例如,在您的程序中,使用:
scanner.close();