资源泄漏错误

时间:2013-12-01 22:12:12

标签: java input java.util.scanner

晚上全部。我是使用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());
    }
}

4 个答案:

答案 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 givingCloseable相关的AutoCloseable,如果基础资源为System.inSystem.outSystem.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();