我用一些使用Scanner的方法编写了一段java代码。第一种方法工作得很好,但第二种方法得到了错误堆栈
" Java . util . nosuchelementexception "。
第一种方法 maxPile 的代码:
public static int maxPile() {
Scanner scan = new Scanner(System.in);
System.out.println("enter max number of piles");
int pMax = scan.nextInt();
scan.close();
return pMax;
}
第二个方法maxMatches的代码:
public static int maxMatches() {
Scanner scan = new Scanner(System.in);
System.out.println("enter max number of matches per pile");
int mMax = scan.nextInt();
scan.close();
return mMax;
}
方法是相同的,但第一个有效,第二个无效。。。我的输出-
enter max number of piles
8
enter max number of matches per pile
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at autoNim.autoNim.maxMatches(autoNim.java:89)
at autoNim.autoNim.main(autoNim.java:12)
('8' 是我的输入,第 12 行调用方法 MaxMatches,第 89 行是 xint mMax=scan.nextInt();
这是因为您关闭了扫描仪。关闭扫描程序始终会关闭基础资源,即 System.in
。关闭 System.in
后,您将无法再使用它。
请勿关闭与 System.in
绑在一起的扫描仪。
资源只能由打开它们的人关闭。JVM在中打开了System.in,当程序完成时,它也会再次关闭它。您不负责管理
系统。在
中,请保持其打开状态。
请注意,如果要关闭扫描仪,必须确保它是异常安全的。也就是说,你需要最后用try-catch来包装它。如果可能,请使用资源尝试:
try (Scanner scanner = new Scanner(...)) {
...
}
这将在try-block之后以异常安全的方式自动关闭它。