Java Scanner赢得';";“完成”;阅读输入

Java Scanner赢得';";“完成”;阅读输入,java,while-loop,java.util.scanner,Java,While Loop,Java.util.scanner,我在使用java的Scanner类时遇到了问题。我可以让它很好地读取我的输入,但问题是当我想输出一些东西时。给定多行输入,当所有输入都被完全读取时,我只想打印一行。以下是我用于读取输入的代码: public static void main(String[] args){ Scanner scanner = new Scanner(System.in); //scanner reads block of input while(scanner.hasNextLine(

我在使用java的Scanner类时遇到了问题。我可以让它很好地读取我的输入,但问题是当我想输出一些东西时。给定多行输入,当所有输入都被完全读取时,我只想打印一行。以下是我用于读取输入的代码:

    public static void main(String[] args){
    Scanner scanner = new Scanner(System.in);   //scanner reads block of input
    while(scanner.hasNextLine()){    
        //body of loop goes here
        String s = scanner.nextLine();
        Scanner ls = new Scanner(s);   //scanner to parse a line of input
        while(ls.hasNext()){
        //body of nested loop goes here
        ls.next();
        }
    }
    System.out.println("Fin");
    }

即使读取了所有输入行,程序也不会到达System.out.println消息。(请注意,消息不能转到其他任何地方,否则它将输出循环运行的次数)。我该如何解决这个问题?如果有任何帮助,我们将不胜感激。

在这种情况下,您正在阅读无限流<如果此扫描仪的输入中有另一行,则code>hasNextLine()将继续返回true。由于它是一个
系统。在
中,它将继续从键盘读取,除非您终止它或告诉流停止

最后按“ctrl+Z”,您将看到它工作正常

编辑:您可以这样做

Scanner scanner = new Scanner(System.in);   //scanner reads block of input
        int BLOCK_SIZE  =3,count=1;
        while(scanner.hasNextLine()){    
            //body of loop goes here
            String s = scanner.nextLine();
            Scanner ls = new Scanner(s);   //scanner to parse a line of input
            while(ls.hasNext()){
            //body of nested loop goes here
            ls.next();
            }
            if(count++==BLOCK_SIZE)
            {
                break;
            }
        }
        System.out.println("Fin");

    }

正如我在你的外环中看到的,你已经使用了

scanner.hasNextLine();
方法。如果必须等待输入,此方法将被阻止。你也有

Scanner scanner = new Scanner(System.in);
声明。因此system.in将一直等待输入,因此hasNextLine()方法必须等待输入。 这就是为什么控制卡在循环中,无法继续


要修复它,您可以首先将输入存储在字符串变量中,然后调用扫描器构造函数。

您需要告诉程序将不再有输入。这是通过附加一个EOF字符来完成的。这可以在Linux上通过在控制台中按Ctrl-D手动完成。我认为在Windows上可以按Ctrl-Z。如果您将输入从一个程序传输到另一个程序,则流将自动关闭

例如

魔术

Scanner scanner = new Scanner(System.in);
    while(scanner.hasNextLine()){ 
就是永远不会停止从系统输入(除非您使用ctrl+d(对于Mac)关闭输入)

要停止循环,我建议在条件中抛出比hasNextLine()更多的内容

例如

Scanner Scanner=新的扫描仪(System.in)//扫描仪读取输入块
int BLOCK_SIZE=3,count=1;

while(scanner.hasNextLine()&&count++你能在两个while循环中放入一些错误检查打印,并告诉我它卡在哪一个循环中吗?我尝试在每个循环中放入打印,但它似乎不是无限循环,而是更像外部while循环无限等待更多输入有人在下面找到了。可能的重复,那么有什么方法可以进行编程吗一旦所有的输入都被读取,它就停止读取?你的程序如何知道它现在应该停止?它不知道,这就是问题所在。当我想在所有的输入都被读取后再输出时,它只是一直在等待另一行输入。如果我有一个输入块,比如说3行文本,我希望它在读取后停止第三行,但是我应该在字符串变量中存储什么呢?程序必须从控制台读取,如果我将输入行保存到字符串中,程序不会仍然等待新的输入行吗?这毫无意义。布尔属性的计算结果总是为真有什么意义。有些东西没有加起来。我缺少什么?@NathanToul伯特:你说得对,我7年前写了这个答案,我一直在跟踪询问者的现有代码。如果你打算终止系统输入,你只需要
hasNextLine
Scanner scanner = new Scanner(System.in);
    while(scanner.hasNextLine()){ 
Scanner scanner = new Scanner(System.in);   //scanner reads block of input
    int BLOCK_SIZE  =3,count=1;
    while(scanner.hasNextLine() && count++ <= BLOCK_SIZE){   //<- Use count here.
        //body of loop goes here
        String s = scanner.nextLine();
        Scanner ls = new Scanner(s);   //scanner to parse a line of input
        while(ls.hasNext()){
        //body of nested loop goes here
        ls.next();
        }
    }
    System.out.println("Fin");

}