上面的一些回答是正确的,说你写的是一个无限循环。但我想澄清一下为什么这是一个无限循环。你使用的
for循环与你可能想到的另一种形式不同:
String[] stringArray = { "1", "2", "3" };
for (String s : stringArray) {
System.out.println(s);
}
在这种情况下,变量
s在每次迭代中都会用集合或数组的下一个值进行初始化。但是那种形式的
for循环只适用于集合和数组,无法与像
Scanner类这样的迭代器一起使用。
你正在使用的
for循环形式不同之处在于初始化子句(你有
String s = in.next()
的地方)仅在第一次通过循环时被调用。
s在第一次设置后就不再改变。
你可以像这样重新编写:
int i = 0;
for (String s = in.next(); !s.equals("end"); s = in.next()) {
System.out.println("The value of i is: " + i++ + " and you entered " + s);
}
但这里的另一个坏处是没有空值或结束检查。如果你在找到等于“end”的字符串之前用尽了所有字符串,那么 for 测试子句(中间的那个)在尝试调用 equals() 方法时会给你一个 NullPointerException。这绝对是不好的实践。我可能会像这样重新编写它:
int i = 0;
while (in.hasNext()) {
String s = in.next();
if (s.equals("end")) {
break;
}
System.out.println("The value of i is: " + i++ + " and you entered " + s);
}
如果你真的想要一个 for 循环而不是 while,最好这样做:
int i = 0;
for (Scanner in = new Scanner(System.in); in.hasNext();) {
String s = in.next();
if (s.equals("end")) {
break;
}
System.out.println("The value of i is: " + i++ + " and you entered " + s);
}
最后一种保留针对测试子句中字符串测试的变体如下:
int i = 0;
String s = "";
for (Scanner in = new Scanner(System.in);
in.hasNext() && !s.equals("end");
s = in.next()) {
System.out.println("The value of i is: " + i++ + " and you entered " + s);
}
在s.equals("end")
之前,您还可以添加一个空值检查以确保完全安全。