java while循环不会无限循环,但for循环会无限循环?

ddrv8njm  于 2022-11-20  发布在  Java
关注(0)|答案(3)|浏览(224)

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 + ".");

        }
 }

我阅读了定义,但仍然不明白为什么一个程序工作,而另一个不工作

sirbozc5

sirbozc51#

TLDR:这两个程序的行为不同,因为它们的代码不等同。
在while循环中,通过调用standardInput.nextDouble()来获取下一个令牌,这会改变standardInput.hasNext()在每次迭代中的结果。
另一方面,for循环版本永远不会获得下一个标记,因此hasNext()返回的值永远不会改变。

aij0ehis

aij0ehis2#

for...loop中,你不是通过读取standardInput来获得它,而是在条件下检查它;在while...loop中执行。
要解决这个问题,你应该在循环中添加扫描仪阅读;

for(int i = 0; standardInput.hasNext(); i++){
    String str = standardInput.next(); // add reading
    System.out.print(i);
}
2jcobegt

2jcobegt3#

这是因为这几行代码只检查是否有要读取的文件,而不是实际阅读文件,因此,没有推进文件指针。

for(int i = 0; standardInput.hasNext(); i++){
    System.out.print(i);

}

而这几行代码实际上使用Scanner对象读取了一个double类型。

while(standardInput.hasNext()) {
    double nextNumber = standardInput.nextDouble();
    sum += nextNumber;
 }

相关问题