这个程序在循环中进入无限循环。拜托,有人可以告诉我为什么吗?
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");
}
}
答案 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重定向;或另一种方法是提供某种停止指令。像"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");
}