如何避免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
相关产品推荐
相关产品推荐

