在java.util.Scanner.throwFor(未知来源)错误

private static int posNum() { Scanner scan = new Scanner(System.in); int input = 0; boolean error; if (scan.hasNextInt()) { input = scan.nextInt(); error = input <= 0; } else { 28 scan.next(); error = true; } while (error) { System.out.print("Invalid input. Please reenter: "); if (scan.hasNextInt()) { input = scan.nextInt(); error = input <= 0; } else { scan.next(); error = true; } } scan.close(); return input; } 

所以我第二次调用这个方法时返回以下错误。

 Exception in thread "main" java.util.NoSuchElementException at java.util.Scanner.throwFor(Unknown Source) at java.util.Scanner.next(Unknown Source) at q2.CylinderStats.posNum(CylinderStats.java:28) at q2.CylinderStats.main(CylinderStats.java:62) 

第一个调用是rad = posNum(); 运行正常,然后secondis height = posNum(); 在进入错误之前不允许输入值。

谢谢

next打电话时,你应检查扫描仪是否有一个。

  if(scan.hasNext()) scan.next(); 

根据Scanner#next的 java doc

NoSuchElementException如果没有更多令牌可用

你可以改变你的方法,如下所示

 private static int posNum(Scanner scan) { int input = 0; boolean error = false; if (scan.hasNext()) { if (scan.hasNextInt()) { input = scan.nextInt(); error = input <= 0; } else { scan.next(); error = true; } } while (error) { System.out.print("Invalid input. Please reenter: "); if (scan.hasNextInt()) { input = scan.nextInt(); error = input <= 0; } else { if (scan.hasNext()) scan.next(); error = true; } } return input; } 

然后像下面这样调用它

  Scanner scan = new Scanner(System.in); int i = posNum(scan); System.out.println(i); int j = posNum(scan); System.out.println(j); 

它运行一次并给你带来麻烦的事实意味着它无法从流中读取任何内容。

来自Java DOC:

当扫描仪关闭时,如果源实现了Closeable接口,它将关闭其输入源。

这意味着它关闭了System.in

因此,打开扫描仪将第二次防止错误。

删除scan.close(); 你的程序应该正常工作!