【发布时间】:2022-01-07 20:07:14
【问题描述】:
我的目的是打印字符串中的所有字符。我想检查一个字符是“q”还是“Q”,只需打破循环并结束程序。假设我使用“Hello World You”作为输入,输出只能是
World
Exception in thread "main" java.util.NoSuchElementException
at java.base/java.util.Scanner.throwFor(Scanner.java:937)
at java.base/java.util.Scanner.next(Scanner.java:1478)
at tictactoe.ScannerDemo.main(ScannerDemo.java:22)
但如果我评论那个 if 语句,输出是正确的,即
Hello
World
K
所以,我不知道它为什么会发生以及如何解决它? 这是我的代码:
public class ScannerDemo {
public static void main(String[] args) {
String s = "Hello World K";
Scanner scanner = new Scanner(s);
while (scanner.hasNext()) {
//if I comment the if statement, the result is normal
if(scanner.next().equalsIgnoreCase("q")){
break;
}
System.out.println(scanner.next());
}
// close the scanner
scanner.close();
}
}
【问题讨论】:
-
if语句中的代码已经通过next()消耗了String的一个标记。这意味着,在第一次循环迭代中,Hello被消耗,然后World在System.out.println()中被消耗。在第二次循环迭代中,K被消耗,但没有更多令牌可供System.out.println(scanner.next())读取,因此出现异常。 -
next的每次调用都会消耗一个完整的令牌(由空白字符分隔)。所以如果你打电话给scanner.next().equalsIgnoreCase("q"),你已经消费了一个完整的单词。因此,下一次调用scanner.next()将读取下一个单词。您必须每次迭代只调用它一次,并记住变量中的字符串。