3

我正在使用 Eclipse Juno,在编写以下代码时,Eclipse 会警告我可能存在内存泄漏:

String s = new Scanner( System.in ).nextLine();

事实上,我从不关闭 System.in 流。JVM(jre7)如何处理这个?好用吗?

4

3 回答 3

3

这是一个虚惊一场,我相信。Eclipse 将其与以下内容混淆:

String s = new Scanner(new FileReader("foo.txt")).nextLine();

每次执行它时都会泄漏一个新的Closeable

但在您的代码中,底层流 ( System.in) 仍然可以访问和使用。当然,从“资源泄漏”的角度来看,没有必要关闭它。


事实上,我从不关闭 System.in 流。JVM(jre7)如何处理这个?

流保持打开状态,System.in直到(可能)应用程序退出。但是,如果你一开始没有打电话new Scanner(System.in),情况并没有什么不同。

于 2012-10-11T12:19:46.133 回答
0

我的回答无效,详情见评论。OP,请接受另一个。

JVM 将保持资源打开,直到您关闭它或程序退出。Eclipse 的警告看起来不错。在 Java 7 上,您可以使用 try-with-resources 模式:

try (Scanner scanner = new Scanner(System.in)) {
    scanner.nextLine();
}

这将在 try 块结束时自动关闭 Scanner。

于 2012-10-11T12:21:49.063 回答
0

您可以放心地忽略这一点。

如果它Scanner也是可关闭的CloseableScanner::close那么它也会关闭基础阅读器。

下面是 的代码Scanner::close

public void close() {
    if (closed)
        return;
    if (source instanceof Closeable) {
        try {
            ((Closeable)source).close();
        } catch (IOException ioe) {
            lastException = ioe;
        }
    }
    sourceClosed = true;
    source = null;
    closed = true;
}
于 2013-12-04T18:04:21.313 回答