【问题标题】:Scanner error with nextInt() [duplicate]nextInt() 的扫描仪错误 [重复]
【发布时间】:2012-10-01 16:07:18
【问题描述】:

我正在尝试使用 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”

【问题讨论】:

    标签: java java.util.scanner


    【解决方案1】:

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

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

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

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

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

    Scanner s = new Scanner(System.in);
    int choice = 0;
    
    if(s.hasNextInt()) 
    {
       choice = s.nextInt();
    }
    
    s.close();
    

    【讨论】:

    • 这让我陷入了一个无限循环,因为括号内的内容永远不会被调用
    • @spatara 是的,它检查扫描器指向的下一个项目是否可以成功转换为整数,如果可以,则 hasNextInt() 将返回 true,否则将返回 false .
    • 我只是从键盘读取,调用方法时没有nextInt
    • 我仍然卡住了...hasNextInt() 正在返回 false,因为它会在我输入 int 之前进行检查...
    • @spatara 它试图将您打印的任何内容解释为整数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    相关资源
    最近更新 更多