扫描程序上的java.util.NoSuchElementException

时间:2015-01-22 19:08:20

标签: java

我有一个名为input的扫描程序,代码如下:

Scanner input = new Scanner(System.in);
    int cFreq = 0;

    System.out
            .println("Enter the symbol which you want to find the frequency of:");
    char s = 'a';
    symbolLoop: while (s == 'a') {
        try {
            s = input.next(".").toLowerCase().charAt(0);
        } catch (InputMismatchException e) {
            System.out.println("Please enter a valid symbol!");
            input.next();
        }
        switch (checkSymbol(s)) {
        case 0:
            s = 'a';
            break;
        case 1:
            break symbolLoop;
        }
    }
    for (int i = 0; i < words.size(); i++) {
        cFreq += words.get(i).find(s, true);
    }
    System.out.println("Number of times " + s + " is in the coded words: "
            + cFreq);
}

然而,当它到达从扫描仪读取的行时,它会以此错误终止:

Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:862)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.next(Scanner.java:1418)
at Home.frequency(Home.java:118)
at Menu.select(Menu.java:58)
at Menu.view(Menu.java:17)
at Home.main(Home.java:22)

(Home是该类的名称)。 我不知道是什么导致了这一点,并希望得到一些帮助! :) 谢谢! 编辑: 我也试过这个代码:String str = input.nextLine();在同一个方法中,但它会抛出相同的错误。

1 个答案:

答案 0 :(得分:0)

如果来自用户的数据不匹配"."正则表达式(可能被分隔符 - 空格包围)next(".")不会抛出NoSuchElementException,而不是InputMismatchException

当Scanner甚至不希望获得更多数据时,会抛出

NoSuchElementException异常,在这种情况下,它确定可能不存在下一个元素。只有当Scanner知道数据源不会有更多元素时才会出现这种情况,如果是Stream,我们将读取整个流内容(如FileInputStream的情况)或者它将被关闭。

System.in的情况下,我们可以假设此流的内容是无限的,因为它是由用户提供的,所以当我们尝试从中读取时,应用程序正在等待用户提供其数据。这意味着,当System.in关闭时,只有Scanner才会抛出NoSuchElementException,因此next没有更多数据可供阅读。
为了避免这种情况,您应该避免关闭使用System.in的流,因为您无法在应用程序中重新打开它。