当前位置: 首页 > 知识库问答 >
问题:

我对JAVA中scanner.next()的用法感到困惑

申屠洛华
2023-03-14
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();
    }
}

共有1个答案

高泳
2023-03-14

查看scanner.hasnext()以及调用scanner.next()的频率,即每次调用hasnext()两次。由于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 );
}
 类似资料:
  • 问题内容: 在碰到此链接http://www.javacodegeeks.com/2013/01/java-thread-pool-example-using- executors-and-threadpoolexecutor 之后,这是我第一次为新项目使用Java线程池。 .html ,我对此更加困惑,这是页面中的代码, 在代码中,创建了一个固定大小的池并创建了10个工作线程,对吗? 线程池应该

  • 我用这样的JAVA_OPTS启动了 jvm: 过了一段时间,当我查看GC日志时:

  • 关于静态的东西: 类共享静态方法的实例 类似的问题: Java:何时使用静态方法 “静态”关键字在类中有什么作用? 我感到困惑的是: 静态方法只有一个内存块? 如果我在多线程中使用静态方法,会阻塞吗?

  • 问题内容: 与此代码有点混淆。 我在pg-go 仓库中找到了这段代码,不知道为什么这样声明。请解释一下用这种方式声明变量的用例是什么。 问题答案: 这在运行时不会执行任何操作,但是除非类型满足接口要求,否则编译将失败。这是一种静态断言。

  • 版本:2.1.11 问题:我有一些错误的参数配置:max.poll.records:500 max.poll.interval.ms:10000。但消耗大约需要25000秒。因此,它将遇到异常:org.apache.kafka.clients.consumer.CommitFailedException:提交无法完成,因为组已经重新平衡并将分区分配给了另一个成员。这意味着对poll()的后续调用之

  • 我正在尝试提出一种解决方案,它涉及在连接操作之后应用一些逻辑,从多个中的中选择一个事件。这类似于reduce函数,但它只返回1个元素,而不是递增地返回。因此最终结果将是单个(,对,而不是一个 每个键保证只到达一次。 假设像上面这样的连接操作,它用4个生成了1个,成功地连接并收集在。现在,我想做的是,立即访问这些值,并执行一些逻辑以将正确匹配到一个。例如,对于上面的数据集,我需要(,和)。 将为每个