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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 12:59:07