Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.util.Scanner不会返回提示_Java_Java.util.scanner - Fatal编程技术网

java.util.Scanner不会返回提示

java.util.Scanner不会返回提示,java,java.util.scanner,Java,Java.util.scanner,该程序不会返回提示符(我一直在通过终端运行它)。为什么呢?如何更正?扫描仪将阻止等待System.in(标准输入)的输入。您必须按Ctrl+C退出程序,按Ctrl+D关闭输入流,或给循环一个退出条件(如键入“退出”),以下是您可以做到的方法: import java.util.Scanner; class newClass { public static void main(String args[]) { Scanner s = new Scanner(System.

该程序不会返回提示符(我一直在通过终端运行它)。为什么呢?如何更正?

扫描仪将阻止等待System.in(标准输入)的输入。您必须按Ctrl+C退出程序,按Ctrl+D关闭输入流,或给循环一个退出条件(如键入“退出”),以下是您可以做到的方法:

import java.util.Scanner;

class newClass {
    public static void main(String args[]) {
        Scanner s = new Scanner(System.in);
        while (s.hasNext()) {
            System.out.println(s.next());
        }
        s.close();
    }
}
此程序不会返回提示符(我一直在通过终端运行它)。为什么会这样?

因为
s.hasNext()
将阻塞,直到进一步的输入可用,并且只有在遇到流结束时才会返回false

从文档中:

如果此扫描仪的输入中有另一个令牌,则返回true此方法在等待输入扫描时可能会阻塞。

在unix系统上,您可以通过键入Ctrl+D来结束流,这将正确地将控制权返回到提示符(或者通过键入Ctrl+C来终止整个程序)

我如何更正它?

你也可以

  • 按照JJ的建议,保留一些用于终止程序的输入字符串,或
  • 您可以依靠用户使用Ctrl+D关闭输入流,也可以
  • 将循环包含在try/catch中,让另一个线程中断主线程,然后主线程优雅地退出
  • 从另一个线程以编程方式执行
    System.in.close()

    • 这是对上述评论的回复。在这里,当收到“退出”时,应用程序将退出


      等待回复“当我键入quit时,它只是回显“quit”一词,仍然没有退出”…quit不等于EOF。你必须有一个if来比较输入和“quit”字符串,这样才能起作用。我猜他的意思是你必须保留一个类似“quit”的单词,并在
      while
      循环条件中检查它。或者通过按Ctrl+D关闭输入流。谢谢你给出了完整的答案。还有一件事。假设我为System.exit(0)保留了“退出”一词,那么如果我输入了“我不能退出巧克力”。这也将在退出时结束,并进入提示。因此,我认为应该在程序的开头添加一行,要求用户按Ctrl+C结束。只是一个请求。你能把try/catch解决方案贴在什么地方吗?。谢谢。那么,什么可以用于流的末尾呢?有任何分隔符吗?只需执行,
      尝试{your while loop}catch(InterruptedException ie){优雅地退出}
      ,然后从另一个线程执行
      if(exitCondition)mainThread.interrupt()
      import java.util.Scanner;
      
      class newClass {
          public static void main(String args[]) {
              Scanner s = new Scanner(System.in);
              while (s.hasNext()) {
                  String nextVal = s.next();
                  if (nextVal.equalsIgnoreCase("quit")) { break; }
                  System.out.println(nextVal);
              }
              s.close();
          }
      }
      
      import java.util.Scanner;
      
      class newClass {
          public static void main(String args[]) {
              Scanner s = new Scanner(System.in);
              while (s.hasNext()) {
                  String temp = s.next();
                  if(temp.trim().equals("quit"))
                      System.exit(0);
                  System.out.println(s.next());
              }
              s.close();
          }
      }