绕过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/