提问人:Tila tila 提问时间:11/19/2022 最后编辑:AnonymousTila tila 更新时间:11/20/2022 访问量:255
hasNext() 使循环无休止地运行,为什么?
hasNext() makes for loop run endlessly, why?
问:
有人可以解释一下,为什么这个循环无休止地运行? 我认为布尔值 **hasNext() ** 只有在不再有元素时才为真。因此,当我在循环中输入某些内容时,就像我输入的内容一样,也无穷无尽。 这些 nmbers 是什么?请解释
import java.util.Scanner;
public class Vocabulary {
public static void main(String[] args) {
Scanner standardInput = new Scanner(System.in);
for(int i = 0; standardInput.hasNext(); i++){
System.out.print(i);
}
}
}
我在互联网上研究了hasNext()。我知道它是什么,我知道for循环是如何工作的。但是我不知道为什么for循环中的hasNext会让程序无休止地运行。
编辑:
另一方面,此代码有效。为什么这段代码有效?
import java.util.Scanner;
public class Sum {
public static void main(String[] args) {
Scanner standardInput = new Scanner(System.in);
double sum = 0;
while(standardInput.hasNext()) {
double nextNumber = standardInput.nextDouble();
sum += nextNumber;
}
System.out.println("The Sum is " + sum + ".");
}
}
答:
1赞
tquadrat
11/19/2022
#1
hasNext()
如果有东西在等待被取走,则返回。但你永远不会拿起它,所以它一直呆在那里等待——无休止地等待,就像你的循环一样。true
Scanner standardInput
评论
1赞
Andrey B. Panfilov
11/19/2022
我相信 TC 问 Q 的原因更明显:他忘记在循环体中调用 next/nextXXX。
0赞
tquadrat
11/20/2022
“you never pick it up” 还有什么意思?那个“捡起”的电话......nextXxxx()
1赞
corndog573
11/19/2022
#2
standardInput.hasNext()
始终为真,这就是为什么你有一个无限循环。
hasNext()
仅检查扫描程序中是否存在其他令牌,并且从一开始就不移动。例如,当输入字符串“StackOverflow”时,下一个标记始终是“StackOverflow”。
在您的案例中使用的一个问题是,使用 Scanner 会停止程序并等待输入,因此只要它接受了输入,它始终是正确的。hasNext()
在这种情况下,您似乎正在尝试迭代扫描仪输入的长度并每次打印当前字符数 - 最好将 的输出分配给变量并迭代该变量。有关示例,请参见下文:nextLine()
import java.util.Scanner;
class Vocabulary {
public static void main(String[] args) {
Scanner standardInput = new Scanner(System.in);
String input = standardInput.nextLine();
System.out.println("Scanner hasNext:" + standardInput.hasNext()); // we can see that hasNext pauses our program
for (int i=0;i<input.length();i++) {
System.out.print(i + " ");
}
}
}
输出如下所示:
StackOverflow
hasNext
Scanner hasNext:true
0 1 2 3 4 5 6 7 8 9 10 11 12
评论
0赞
Tila tila
11/19/2022
嘿,非常感谢。我可以问你吗,我编辑了我的问题并放了另一个带有 while 循环的代码。在这个while循环中,我有相同的standardInput.hasNext()。但是此代码有效。有什么不同,我的意思是为什么这不会无限地进行?
评论
java Vocabulary </dev/null
/dev/null
standardInput.hasNext()
while
for
hasNext()
的文档:“如果此扫描程序的输入中有另一个令牌,则返回 true。此方法可能会在等待输入扫描时阻塞。扫描仪不会前进到任何输入。在这种情况下,如果不关闭,可能仍会提供一些数据,因为用户可能正在控制台中创建/写入数据,并且尚未按回车键。System.in