hasNext()的定义是“如果此扫描程序的输入中有另一个标记,则返回true。此方法可能会在等待扫描输入时阻塞。扫描程序不会前进到任何输入之前。”
当我把**standardInput.hasNext()**放在for循环中时,程序运行到无穷大。但是如果我把它放在while循环中,它就不会运行到无穷大。这两个程序的区别在哪里?为什么一个能用,另一个不能用?
for循环:
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);
}
}
}
while循环:
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 + ".");
}
}
我阅读了定义,但仍然不明白为什么一个程序工作,而另一个不工作
3条答案
按热度按时间sirbozc51#
TLDR:这两个程序的行为不同,因为它们的代码不等同。
在while循环中,通过调用
standardInput.nextDouble()
来获取下一个令牌,这会改变standardInput.hasNext()
在每次迭代中的结果。另一方面,for循环版本永远不会获得下一个标记,因此
hasNext()
返回的值永远不会改变。aij0ehis2#
在
for...loop
中,你不是通过读取standardInput
来获得它,而是在条件下检查它;在while...loop
中执行。要解决这个问题,你应该在循环中添加扫描仪阅读;
2jcobegt3#
这是因为这几行代码只检查是否有要读取的文件,而不是实际阅读文件,因此,没有推进文件指针。
而这几行代码实际上使用Scanner对象读取了一个double类型。