为何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
相关产品推荐
相关产品推荐

