提问者:小点点

Java Scanner运行时错误Java.util.NoSuchElementException[重复]


我用一些使用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();


共1个答案

匿名用户

这是因为您关闭了扫描仪。关闭扫描程序始终会关闭基础资源,即 System.in。关闭 System.in 后,您将无法再使用它。

请勿关闭与 System.in 绑在一起的扫描仪。

资源只能由打开它们的人关闭。JVM在中打开了System.in,当程序完成时,它也会再次关闭它。您不负责管理系统。在中,请保持其打开状态。

请注意,如果要关闭扫描仪,必须确保它是异常安全的。也就是说,你需要最后用try-catch来包装它。如果可能,请使用资源尝试:

try (Scanner scanner = new Scanner(...)) {
    ...
}

这将在try-block之后以异常安全的方式自动关闭它。