我用一些使用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();
)
答案 0 :(得分:2)
这是因为你关闭了扫描仪。关闭扫描程序总是会关闭基础资源,即System.in
。关闭System.in
后,您将无法再使用它。
请勿关闭与System.in
绑定的扫描仪。
资源只能由打开资源的人关闭。 JVM打开了System.in
,并且在程序完成时也会再次关闭它。您无需管理System.in
,请保持开放状态。
请注意,如果你想关闭扫描仪,你必须确保它是异常安全的。即你需要的的try-catch-最后的把它包起来。如果可能的话,最好使用 try-with-resources :
try (Scanner scanner = new Scanner(...)) {
...
}
将自动关闭它在一个异常安全的方式后的试块的。