11

我正在尝试使用 Scanner 从键盘获取 int,但出现以下错误:

Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Scanner.java:907)
    at java.util.Scanner.next(Scanner.java:1530)
    at java.util.Scanner.nextInt(Scanner.java:2160)
    at java.util.Scanner.nextInt(Scanner.java:2119)
    at TableReader.mainMenu(TableReader.java:122)
    at TableReader.main(TableReader.java:76)

这就是我所拥有的。它独立于我的程序的其余部分,我不明白为什么这不起作用。如果有帮助,它会在一个在 while 循环中调用的方法中声明。

    // scan for selection
    Scanner s = new Scanner(System.in);
    int choice = s.nextInt();           // error occurs at this line
    s.close();

我逐步使用调试器并将错误缩小到:

Java 运行时环境检测到致命错误:SIGSEGV (0xb) at pc=0xb6bdc8a8, pid=5587, tid=1828186944

JRE 版本:7.0_07-b30 Java VM:OpenJDK Server VM(23.2-b09 混合模式 linux-x86)有问题的框架:V [libjvm.so+0x4258a8] java_lang_String::utf8_length(oopDesc*)+0x58

无法写入核心转储。核心转储已被禁用。要启用核心转储,请在再次启动 Java 之前尝试“ulimit -c unlimited”

4

1 回答 1

22

您应该使用类中的hasNextXXXX()方法Scanner来确保有一个整数可供读取。

问题是你被称为nextInt()从对象指向的流中读取下一个整数Scanner,如果没有整数可以读取(即如果输入用尽,那么你会看到NoSuchElementException

从 JavaDocs 中,该nextInt()方法将在以下条件下抛出这些异常:

  • InputMismatchException - 如果下一个标记与 Integer 正则表达式不匹配,或者超出范围
  • NoSuchElementException - 如果输入已用尽
  • IllegalStateException - 如果此扫描仪已关闭

您可以使用以下hasNextInt()方法轻松解决此问题:

Scanner s = new Scanner(System.in);
int choice = 0;

if(s.hasNextInt()) 
{
   choice = s.nextInt();
}

s.close();
于 2012-10-11T04:05:31.503 回答