程序进入无限循环

Program goes in an infinite loop

这个程序在 while 循环中进入无限循环。拜托,有人能告诉我为什么吗?

import java.util.Scanner;
public class program {
    public static void main(String[] pars) {
        System.out.println("Insert something.");
        Scanner read = new Scanner(System.in);
        String s = "";
        while(read.hasNext()) {
            System.out.println(read.next());
        }
        System.out.println("End of program");
    }
}

阅读 Scanner#hasNext() 的 Javadoc:

Returns true if this scanner has another token in its input. This method may block while waiting for input to scan. The scanner does not advance past any input.

因此,在您的情况下,while 循环将始终执行,每次等待用户输入。由于 Scanner 链接到 System.in,输入流将始终阻塞,直到用户输入字符串并且 hasNext() 将始终 return true,除非用户发出结束信号文件(例如通过 Ctrl+z 组合 Windows)。 Scanner#hasNext() 在读取输入大小已知且文件末尾标记流结束的文件时更方便。

这里结束循环的一种方法是在输入上添加条件:

while (read.hasNext()) {
    s = read.next();
    if(s.equals("quit")) {
       break;
    }
    System.out.println(s);
}

P.S.: 命名类以大写字母开头更常规。

问题出在这一行:

while(read.hasNext()) {

如果您使用 System.in 作为用户提供的流,它将 - 如果没有这样的输入可用 - 正如@manouti 所说,阻止并等待输入。但即使您提供输入,它也会一直等待。系统无法检测用户是否想在未来提供额外的输入。

只有停止,如果Stream结束。这可以在两种情况下:

  • 文件结尾(在 I/O 重定向的情况下,如 java -jar program.jar < input.dat;或
  • 在大多数 shell 中,用户使用 Ctrl+D 标记流的结尾。这标志着 流结束

另一种方法是提供某种停止指令。类似于 "END"。因此:

while(read.hasNext()) {
    String nx = read.next();
    if(nx.equals("END")) {
        break;
    }
    System.out.println(nx);
}

只需删除 while 循环

public static void main(String[] pars) {
System.out.println("Insert something.");
    Scanner read = new Scanner(System.in);
    String s = "";

        System.out.println(read.next());

    System.out.println("End of program");
}

或者如果你想显示某些 no.of 字符串然后适当地提到条件。

public static void main(String[] pars) {
System.out.println("Insert something.");
    Scanner read = new Scanner(System.in);
    String s = "";
    int i=0;
    while(i<5) {
        System.out.println(read.next());
        i++;
    }
    System.out.println("End of program");
}