使用 Java.Util.Scanner 的 NoSuchElementException

NoSuchElementException with Java.Util.Scanner

提问人:adaam 提问时间:12/6/2012 最后编辑:4castleadaam 更新时间:12/24/2022 访问量:113985

问:

我对 Java 很陌生,但正在阅读《Java:如何编程》(第 9 版)一书,并且已经举了一个例子,在我的一生中,我无法弄清楚问题是什么。

以下是教科书中源代码示例的(略微)增强版本:

import java.util.Scanner;
public class Addition {
  public static void main(String[] args) {
    // creates a scanner to obtain input from a command window

    Scanner input = new Scanner(System.in);

    int number1; // first number to add
    int number2; // second number to add
    int sum; // sum of 1 & 2

    System.out.print("Enter First Integer: "); // prompt
    number1 = input.nextInt(); // reads first number inputted by user

    System.out.print("Enter Second Integer: "); // prompt 2 
    number2 = input.nextInt(); // reads second number from user

    sum = number1 + number2; // addition takes place, then stores the total of the two numbers in sum

    System.out.printf( "Sum is %d\n", sum ); // displays the sum on screen
  } // end method main
} // end class Addition

我收到“NoSuchElementException”错误:

Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:838)
at java.util.Scanner.next(Scanner.java:1461)
at java.util.Scanner.nextInt(Scanner.java:2091)
at java.util.Scanner.nextInt(Scanner.java:2050)
at Addition.main(Addition.java:16)
Enter First Integer:

我知道这可能是由于源代码中的某些内容与 from 的类不兼容,但是在推断问题是什么方面,我真的无法比这更进一步。Scannerjava.util

java.util.scanner

评论

0赞 Curlystraw 12/6/2012
您使用的是什么 SDK?我刚刚将您的代码粘贴到 Eclipse 中,它似乎工作正常!
0赞 adaam 12/6/2012
我在Mac OS X上的TextMate中运行该程序,尽管当我从终端运行该程序时,我没有收到任何错误。所以我认为这是一个环境问题,而不是与源代码无关
1赞 Ascendant 2/8/2014
@adaam 您出现此错误的原因是 TextMate 终端模拟器无法(或未正确配置为)接受输入,我在 Sublime Text 2 中遇到了同样的问题。

答:

3赞 Addict 12/6/2012 #1

在为变量赋值之前,应使用。hasNextInt()

12赞 user813853 12/6/2012 #2

NoSuchElementException 由 Enumeration 的 nextElement 方法引发,以指示枚举中没有更多元素。

http://docs.oracle.com/javase/7/docs/api/java/util/NoSuchElementException.html

这个怎么样:

if(input.hasNextInt() )
     number1 = input.nextInt(); // if there is another number  
else 
     number1 = 0; // nothing added in the input 

评论

0赞 adaam 12/6/2012
我收到“变量 number1 可能尚未初始化”,第二个变量也是如此。
0赞 12/6/2012
这意味着您尚未初始化变量 。尝试number1int number1 = 0; int number2 = 0;
0赞 Subhrajyoti Majumder 12/6/2012 #3

Integer#nextIntthrows - 如果输入已用尽NoSuchElementException

您应该检查是否有下一行Integer#hasNextLine

if(sc.hasNextLine()){
    number1=sc.nextInt();
}

评论

0赞 adaam 12/6/2012
顺便说一句,(我使用 Mac OS X)我一直在尝试从我的文本编辑器(TextMate- 允许这种过程)中编译和运行此源代码。但是尽管有您的建议,我仍然一直在经历 NoSuchElementException。但是,当我在终端中javac和java文件时,上面的示例可以完美运行-为什么会这样?
2赞 Terry Li 12/6/2012 #4

NoSuchElementException如果没有更多可用代币,将被抛出。这是由于在不检查是否有任何可用整数的情况下调用所致。为了防止这种情况发生,您可以考虑使用 来检查是否有更多可用的代币。nextInt()hasNextInt()

1赞 Kaushal Vyas 007 1/13/2019 #5

您必须在末尾添加 input.close() ...

1赞 Deepanshu 4/1/2020 #6

此错误主要发生在您正在测试代码的 0nline IDE 的情况下。它没有正确配置,就像您在任何其他IDE /记事本上运行相同的代码一样,它工作正常,因为在线IDE的设计方式不会调整格式的输入代码,因此您必须按照在线IDE支持的方式进行输入。

1赞 maganoegi 10/8/2020 #7

如果可以的话,我今天解决了这个问题,因为我意识到我有多个函数,每个函数都使用一个扫描仪的实例。所以基本上,尝试重构,这样你只打开了一个实例,然后最后关闭了 - 这应该有效。

2赞 Saeed Dai Alnoor 3/9/2021 #8

当我输入 5.3、23.8 等数字时,我在 nextDouble() 中遇到了这个错误......我认为这是来自我的电脑,具体取决于使用阿拉伯语的计算机设置(23,33 而不是 23.33),我用添加修复了它: Scanner scanner = new Scanner(System.in).useLocale(Locale.US);

2赞 douglas 8/29/2022 #9

对于使用 gradle 应用程序插件的任何人,您必须将其连接到 build.gradle(.kts) 中的标准控制台,否则如果您尝试使用扫描器,它会继续抛出 NoSuchElementException 错误。

对于时髦:

run {
standardInput = System.in}

For gradle kotlin dsl:

tasks.withType<JavaExec>() {
standardInput = System.`in`}
0赞 Utkarshthgr8 12/24/2022 #10

我在类的顶部添加了一个静态扫描器 (sc),并在我使用返回语句的整个类中时关闭它 (sc.close())。同样,这是另一个答案所建议的扫描仪的一个实例,它应该是静态的。

package com.example.com;
import java.util.Scanner;

public class someClass {
    static Scanner sc = new Scanner(System.in);
    //Whole world of methods using same sc.
    //sc.close()); return;
}

除此之外,您可以在令人不安的方法顶部添加 @SuppressWarnings(“resource”) 以使警告消失。但要小心资源泄漏。