【问题标题】:I'm confused the use of scanner.next()in JAVA我对在 JAVA 中使用scanner.next() 感到困惑
【发布时间】: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 被消耗,然后WorldSystem.out.println() 中被消耗。在第二次循环迭代中,K 被消耗,但没有更多令牌可供System.out.println(scanner.next()) 读取,因此出现异常。
  • next 的每次调用都会消耗一个完整的令牌(由空白字符分隔)。所以如果你打电话给scanner.next().equalsIgnoreCase("q"),你已经消费了一个完整的单词。因此,下一次调用scanner.next() 将读取下一个单词。您必须每次迭代只调用它一次,并记住变量中的字符串。

标签: java java.util.scanner


【解决方案1】:

看看你的代码

        while (scanner.hasNext()) {
            //if I comment the if statement, the result is normal
            if(scanner.next().equalsIgnoreCase("q")){
                break;
            }

            System.out.println(scanner.next());
        }

在 if 语句的条件下,您正在调用 next()。这不会抛出任何异常,因为它已经被 hasNext() 调用检查过。但是稍后您正在打印令牌,而 hasNext() 调用未对其进行检查。此外,在 next() 调用期间,前一个令牌在 if 条件中丢失。

尝试使用 ..

        while (scanner.hasNext()) {
            String nextToken = scanner.next();
            if (nextToken.equalsIgnoreCase("q")) {
                break;
            }

            System.out.println(nextToken);
        }

【讨论】:

    【解决方案2】:

    你调用了 next() 两次而不检查是否还有令牌......

    试试

    while (scanner.hasNext()) {
    
      String nextValue = scanner.next();
                
      if(nextValue.equalsIgnoreCase("q")){
        break;
      }
    
      System.out.println(nextValue);
    }
    

    【讨论】:

      【解决方案3】:

      查看scanner.hasNext() 以及您拨打scanner.next() 的频率,这是每次拨打hasNext() 的2 次。因为next() 返回下一个元素,所以第一个调用将返回“Hello”,第二个返回“World”,正如您已经注意到的。

      现在,在循环的第二次迭代中,仍然有一个值为“You”的“next”元素,该元素由 if 语句中的 next() 调用返回。然而,下一次对next() 的调用会中断,因为没有更多的输入。

      要解决这个问题,只需调用一次next() 并保留对字符串的引用:

      while (scanner.hasNext()) {
         String token = scanner.next();
         if(token .equalsIgnoreCase("q")){
             break;
         }
      
         System.out.println(token );
      }
      

      顺便说一句,I want to check if one character is "q" or "Q" 与您的代码不匹配,因为您只检查整个 字符串。如果这是预期的行为,那么你没问题,但否则你需要使用 toCharArray()charAt(index) 来检查 individual 字符(但这可能很奇怪,例如,如果输入是“我可以问一个问题:这是打印出来的吗?”它会在“问题”处停止)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-29
        • 2016-11-18
        • 1970-01-01
        • 1970-01-01
        • 2018-10-03
        • 1970-01-01
        • 1970-01-01
        • 2016-06-22
        相关资源
        最近更新 更多