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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 08:15:49