java - 未关闭的扫描仪的垃圾收集

标签 java garbage-collection java.util.scanner

绕过skipping nextLine() issue ,并且为了使代码更清晰,我是否多次使用了以下方法:

private String getInput() {
    return new Scanner(System.in).nextLine();
}

这不是任何生产代码,只是小项目,所以我不太关心这是否会带来性能问题,因为我发现这种方法非常方便。我真的很喜欢对所有输入使用此方法并解析返回值。

对于这个问题 - 这是一种非常糟糕的做法吗?不关闭 Scanner 感觉不太好,但由于该对象超出了我的范围,我一直认为 Scanner 对象应该被垃圾收集,因此也应该关闭。 gc 如何处理这个问题?

最佳答案

在这种情况下,您不能关闭它,否则System.in也会关闭,这样您将无法获得任何新输入,事实上,如果您执行这个简单的代码:

Scanner scanner = new Scanner(System.in);
scanner.close();
scanner = new Scanner(System.in);
scanner.nextLine(); // -> Exception here

您将得到下一个异常:

Exception in thread "main" java.util.NoSuchElementException: No line found
    at java.util.Scanner.nextLine(Scanner.java:1540)
    at hello.Application.main(Application.java:44)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)

我在你的方法中看到的唯一真正的问题是,如果你在每次调用时创建一个新的 Scanner 实例时定期调用此方法,它可能会效率低下,而且它可能是 JDK特定于实现,因为如果您有一个实现了 finalize 方法的 Scanner 实现,它可能会关闭 Scanner ,从而导致上述错误。

关于java - 未关闭的扫描仪的垃圾收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37599067/

相关文章:

Java 即时字符串替换

java - JMeter:jmeter.bat和java中的heapsize可以相同吗?

java - 什么时候应该关闭扫描仪?

java - 为什么 nextInt() 忽略/n?

Java 扫描器使用\R 模式(缓冲区边界问题)

java - Talend 在 tTikaExtractor 上迭代

java - getExtras() 在向后导航时返回 null

java - 如何使用独立/容器化服务器运行 Selenium 测试

C# .NET 3.5 : Memory Pool, 知道对象何时被释放?

c# - 重新分配一次性对象变量如何工作?