我有一个名为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();
在同一个方法中,但它会抛出相同的错误。
答案 0 :(得分:0)
如果来自用户的数据不匹配"."
正则表达式(可能被分隔符 - 空格包围)next(".")
不会抛出NoSuchElementException
,而不是InputMismatchException
。
NoSuchElementException
异常,在这种情况下,它确定可能不存在下一个元素。只有当Scanner知道数据源不会有更多元素时才会出现这种情况,如果是Stream,我们将读取整个流内容(如FileInputStream的情况)或者它将被关闭。
在System.in
的情况下,我们可以假设此流的内容是无限的,因为它是由用户提供的,所以当我们尝试从中读取时,应用程序正在等待用户提供其数据。这意味着,当System.in
关闭时,只有Scanner才会抛出NoSuchElementException,因此next
没有更多数据可供阅读。
为了避免这种情况,您应该避免关闭使用System.in
的流,因为您无法在应用程序中重新打开它。