在Scanner.nextInt外围添加try/catch处理InputMismatchException时出现无限循环的修复方案咨询
解决Scanner输入非数字时的无限循环问题
这个问题我太熟了!当你输入字母触发InputMismatchException后,Scanner并没有把那个错误的输入从输入流里移除,所以下一次调用nextInt()时,它还是会读取到同一个无效输入,直接再次抛出异常,无限循环就这么来了。
最佳修复方案
核心就是在catch块里,调用scanner.next()来消费掉那个无效的输入,让Scanner能继续读取后续的新输入。另外,你的代码里还有一些逻辑可以优化,我帮你整理了完整的修复版本:
import java.util.InputMismatchException; import java.util.Scanner; public class PlayerSetup { private static final int MIN_PLAYERS = 2; // 可根据实际需求调整最小值 private static final int MAX_PLAYERS = 8; // 可根据实际需求调整最大值 private int numberOfPlayers; public void setNumberOfPlayers(Scanner scanner) { boolean valid = false; this.numberOfPlayers = 0; int input = 0; do { do { System.out.println("Please enter the number of players (minimum " + MIN_PLAYERS + " & maximum " + MAX_PLAYERS + ".)"); try { input = scanner.nextInt(); // 输入有效时先判断范围 if (input > MAX_PLAYERS || input < MIN_PLAYERS) { System.out.println("Invalid input. Enter a number between " + MIN_PLAYERS + " and " + MAX_PLAYERS + "."); } else { this.numberOfPlayers = input; break; // 范围正确,跳出内层循环 } } catch (InputMismatchException e) { System.out.println("Please type a numeric digit only"); // 关键:消费掉无效的非数字输入,避免无限循环 scanner.next(); } } while (true); // 直到输入有效且范围正确才跳出 // 确认环节的输入校验 System.out.printf("You have chosen to include %d players. Is this correct? (Y/N)%n", this.numberOfPlayers); String answer; do { answer = scanner.next().trim().toLowerCase(); if (answer.equals("y") || answer.equals("n")) { break; } else { System.out.println("Please enter a valid response - y / n"); } } while (true); switch (answer) { case "y": System.out.println("Great - let's start the game with " + this.numberOfPlayers + " players"); valid = true; break; case "n": System.out.println("Please re-enter the number of players"); valid = false; break; } } while (!valid); } }
关键修复点说明
- 消费无效输入:在
catch块中添加scanner.next(),把输入流里的非数字内容清空,这样Scanner才能接收新的输入,从根本上解决无限循环问题。 - 优化内层循环逻辑:原来的内层循环判断容易出现逻辑漏洞,改成无限循环直到输入有效且范围正确,代码逻辑更清晰易懂。
- 强化确认环节校验:增加了对确认输入的循环校验,避免用户输入非Y/N时程序陷入混乱。
- 提升代码可读性:调整了提示信息的表述,让用户更清楚输入要求;同时统一将确认输入转为小写,减少分支判断的冗余。
这样修改后,不管用户输入字母、符号还是超出范围的数字,程序都能正确处理,不会再陷入无限循环啦。
内容的提问来源于stack exchange,提问作者smcconville
相关产品推荐
相关产品推荐

