You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Scanner的hasNext()在for循环无限运行,while循环却不会?

为什么Scanner的hasNext()在for循环中无限运行,在while循环中却正常?

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

问题解析

核心差异在于是否读取并消耗了输入流中的标记:

  • while循环的正常逻辑:
    每次hasNext()判定输入存在标记后,代码调用nextDouble()读取并消耗掉这个标记。当输入流里的所有标记都被读完,若用户终止输入(如Windows按Ctrl+Z、Linux按Ctrl+D),hasNext()会返回false,循环自然结束。

  • for循环的无限循环原因:
    你的for循环仅在条件中判断hasNext(),但循环体内没有调用任何nextXXX()方法去读取输入流里的标记。输入标记始终留在流中,每次循环判断hasNext()都会返回true,循环永远无法终止,只能手动中断程序。

简单总结:while循环每次判断后会“处理”输入,消耗掉标记;for循环只判断不处理,标记一直存在,导致循环停不下来。

内容的提问来源于stack exchange,提问作者Tila tila

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 05:46:09