程序进入无限循环

时间:2015-01-10 13:47:28

标签: java java.util.scanner

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

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");
    }
}

3 个答案:

答案 0 :(得分:5)

阅读Scanner#hasNext()的Javadoc:

  

如果此扫描器的输入中有另一个标记,则返回true。 此方法可能会在等待扫描输入时阻止。扫描仪不会超过任何输入。

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

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

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

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

答案 1 :(得分:4)

问题在于这一行:

while(read.hasNext()) {

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

如果Stream结束,它只会停止。这可以在两个条件下:

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

另一种方法是提供某种停止指令。像"END"这样的东西。因此:

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

答案 2 :(得分:0)

只需删除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");
}

或者,如果你想要显示某些字符串,请正确提及条件。

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");
}