Java井字棋输入字母触发InputMismatchException退出的非catch解决方法
解决Java井字棋非数字输入崩溃问题(无catch实现)
核心思路是利用Scanner的hasNextInt()方法预先判断输入是否为整数,避免触发InputMismatchException,同时处理无效输入的缓冲区清理,保证程序正常运行。
修改后的Main类代码
import java.util.Scanner; public class Main { public static void main(String[] args) { TicTacToe game = new TicTacToe(); Scanner scanner = new Scanner(System.in); game.printBoard(); System.out.println(game.getDirections()); // 持续游戏直到结束 while (!game.checkWin()) { // 先检查输入是否为整数 if (!scanner.hasNextInt()) { System.out.println("Invalid input, please enter a number"); scanner.next(); // 清除缓冲区中的无效输入,避免死循环 continue; // 跳过当前循环,重新等待有效输入 } // 读取用户输入的步数 int move = scanner.nextInt(); // 验证位置是否未被占用并执行落子 boolean spaceNotOccupied = game.checkInput(move); if (spaceNotOccupied) { game.makeMove(move); } else { // 位置已被占用时提示,且不切换玩家 System.out.println("Space is occupied, please choose another one"); continue; } // 检查游戏是否结束 if (game.checkWin()) { game.printResults(); return; } // 切换玩家并打印更新后的棋盘 game.changePlayer(); game.printBoard(); System.out.println(game.getDirections()); } // 打印最终游戏结果 game.printResults(); } }
关键修改点说明
- 预检查输入有效性:用
scanner.hasNextInt()判断用户输入是否为整数,非整数时直接输出提示,避免调用nextInt()触发异常。 - 清理无效输入缓冲区:调用
scanner.next()读取并丢弃无效的非数字输入,防止后续循环一直读取同一个无效输入导致死循环。 - 保留玩家回合:当输入无效或位置已被占用时,用
continue跳过当前循环的剩余逻辑(不切换玩家、不打印棋盘),保证当前玩家可以重新输入。
补充说明
原makeMove方法中针对1-9以外数字的提示逻辑可以保留,和新的非数字提示形成完整的输入校验体系。
内容的提问来源于stack exchange,提问作者aggravating_web
相关产品推荐
相关产品推荐

