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

如何避免Java程序因控制台输入非数字等错误输入发生崩溃

问题原因

你的代码在输入非数字时异常的核心原因有3个:

  • 触发InputMismatchException异常后,Scanner的输入缓冲区中仍残留着未被读取的非法输入(比如输入的字母),下次再调用nextInt()时会直接再次触发异常,要么进入死循环要么直接终止逻辑
  • 仅对第一次输入的nextInt()做了异常捕获,循环内提示「位置已被占用」后的nextInt()没有做异常捕获,输入非数字时还是会抛出未被处理的异常
  • 捕获异常后没有添加重试逻辑,输出错误提示后方法直接退出,无法继续接收用户输入
修复方案
  • 将输入读取和校验的逻辑放到循环中,出现异常或输入非法时始终重试直到拿到合法输入
  • 每次触发InputMismatchException后调用input.next()清空缓冲区的残留非法内容
  • 新增输入范围校验:即使输入是数字,也要判断是否在1-9区间内,避免非法数字导致后续走子逻辑出错
  • 调整异常捕获的范围,覆盖所有nextInt()调用的场景
修正后代码
import java.util.InputMismatchException;
import java.util.Scanner;

public class HumanPlayer {
    static Scanner input = new Scanner(System.in);

    public static void playerMove(char[][] gameBoard) {
        int move;
        boolean validMoveResult = false;

        // 外层循环保证拿到合法数字且走子有效才退出
        while (!validMoveResult) {
            System.out.println("请选择1-9的格子");
            try {
                move = input.nextInt();
                // 先校验数字范围
                if (move < 1 || move > 9) {
                    System.out.println("错误:请输入1-9之间的数字");
                    continue;
                }
                // 校验走子是否合法
                validMoveResult = Game.validMove(move, gameBoard);
                if (!validMoveResult) {
                    Sound.errorSound(gameBoard);
                    System.out.println("该格子已被占用!");
                    continue;
                }
                // 走到这里说明输入和走子都合法,执行落子
                System.out.println("玩家已选择位置:" + move);
                Game.placePiece(move, 1, gameBoard);
            } catch (InputMismatchException e) {
                System.out.println("错误:输入不是有效数字");
                // 清空Scanner缓冲区的非法输入,是修复问题的核心步骤
                input.next();
            }
        }
    }
}
补充说明

修复后的代码覆盖了所有异常场景,不管是输入非数字、输入超出1-9范围的数字、选择已被占用的格子,都会给出对应提示并要求用户重新输入,不会出现崩溃或逻辑中断的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 08:39:03