有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

while循环之后的java代码永远不会执行

显然,我的真实代码更复杂,但下面是一个示例:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in).useDelimiter("\n");
        String[] cmdSplit = null; 
        while (true) {
            while (input.hasNext()) {
                cmdSplit = input.next().split("\\s+");
                System.out.println("stuff");
            }
            for (int i = 0; i < cmdSplit.length; i++) System.out.println(cmdSplit[i]);
        }
    }
}

在上面的示例中,代码从System.in获取输入,将其拆分,并输出每个片段。但是,由于某种原因,内部while循环之后的代码永远不会执行。如果我用if替换while,它会工作。如果您测试它,您可以看到它不会无限运行,因为它只打印“东西”一次,显示循环运行一次。while循环有什么问题


共 (3) 个答案

  1. # 1 楼答案

    System.in读取与从文件或其他固定大小的输入源读取不同。在您创建输入之前,输入不一定存在,因此在输入实际到达(即您键入输入)之前,尝试读取输入需要block。尝试键入另一行-您将再次看到stuff消息;这将允许.hasNext()返回,因为现在有输入

    要使.hasNext()返回false,需要关闭输入源。对于命令行应用程序,您可以通过发送EOF signal(在Linux上为Ctrl+D)来实现这一点,它告诉进程stdin没有更多的输入。但是,这通常不是您希望程序工作的方式,因此,如果您的目的是只读取一行,然后继续,那么实际上您应该使用if而不是您尝试使用的while。稍后,如果您需要读取更多输入,您将再次调用.hasNext(),您的程序将在那里阻塞,直到用户传递更多输入


    正如@user7提到的,您的外部while (true)while(input.hasNext())组合是多余的。如果您只想读取一次,请去掉while (true)并使用if (input.hasNext())。否则,如果您想永远阅读,只需将两个循环组合起来:

    while (input.hasNext()) {
      cmdSplit = input.next().split("\\s+");
      System.out.println("stuff");
      for (int i = 0; i < cmdSplit.length; i++) System.out.println(cmdSplit[i]);
    } // Loop will terminate once stdin is closed, e.g. by the user sending EOF.
    
  2. # 2 楼答案

    是的,您的代码不会进入for循环,因为Scanner.hasNext()将始终侦听控制台的输入

    你必须打破循环,才能走出去进入for循环

       Scanner input = new Scanner(System.in).useDelimiter("\n");
        String[] cmdSplit = null;
        while (true) {
          while (input.hasNext()) {
            cmdSplit = input.next().split("\\s+");
            System.out.println("stuff");
            break;
          }
          for (String element : cmdSplit) {
            System.out.println(element);
          }
        }
    
  3. # 3 楼答案

    它只打印一次“stuff”的原因是hasNext()返回false

    让我解释一下我所观察到的情况

    为了不确定地打印“资料”,必须删除作业。这意味着一旦您分配了输入,扫描仪就不再有任何标记

    The java.util.Scanner.hasNext() method Returns true if this scanner has another token in its input.
    

    这将无限期打印

     while (input.hasNext()) {
                // cmdSplit = input.next().split("\\s+");
                System.out.println("stuff");
            }