Java新手求助:带用户输入的for循环无限循环问题排查
解决Scanner输入无效时的无限循环问题
嘿,我懂你现在的困扰——这绝对是Java Scanner刚上手时最容易踩的坑之一!你的思路其实没问题:输入无效就不递增循环计数,但问题出在无效输入还留在Scanner的缓冲区里,导致每次循环都重复读到同一个无效内容,进而无限触发"Invalid Number"提示。
问题根源
当你输入一个非整数(比如字母、符号)时,scanner.hasNextInt()会返回false,但这个无效的输入并没有被消费掉——它还卡在输入缓冲区里。下一次循环执行hasNextInt()时,依然会读到这个无效内容,再次返回false,如此往复就陷入了无限循环。
修复方案
只需要在else块里添加一行scanner.next(),把缓冲区里的无效输入丢弃掉,这样下一次循环就能正常等待用户的新输入了。同时你之前的i--是对的,用来抵消for循环自动递增的计数,确保无效输入不占用10次机会。
修正后的完整代码
import java.util.Scanner; public class Main { public static void main(String[] args) { int sum = 0; Scanner scanner = new Scanner(System.in); for(int i = 1; i<=10; i++){ System.out.println("Enter number #" + i + " "); boolean validInt = scanner.hasNextInt(); if(validInt){ int num = scanner.nextInt(); sum += num; } else{ System.out.println("Invalid Number"); // 丢弃缓冲区里的无效输入 scanner.next(); // 不消耗循环次数 i--; } } System.out.println("Sum was " + sum); scanner.close(); } }
额外小提示
如果想让用户可以连续输入多次无效内容直到输入正确,也可以把判断改成一个while循环,这样就不需要手动调整i的值,逻辑会更清晰:
// 替换原来的if-else块 while (!scanner.hasNextInt()) { System.out.println("Invalid Number, please try again:"); scanner.next(); } int num = scanner.nextInt(); sum += num;
内容的提问来源于stack exchange,提问作者I_keep_getting_downvoted
相关产品推荐
相关产品推荐

