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

Java井字棋输入X崩溃问题求助:需支持输入0和X正常游玩

解决输入非整数(如X)时程序崩溃的问题

嘿,我来帮你搞定这个问题!首先咱们得搞清楚为啥输入X会崩:你的代码里用scan.nextInt()来读取输入,但nextInt()只能解析整数,当用户输入X这种字符串时,它会直接抛出InputMismatchException,而你当前的try-catch只抓了IllegalArgumentException,这个异常没被处理,程序自然就崩溃了。而且就算你抓了这个异常,Scanner的缓冲区里还留着那个无效的X,不清理的话下一次读取还是会读到它,陷入死循环。

下面是具体的修复方案,我给你改好了代码,还标注了关键修改点:

修改后的完整main方法代码

public static void main(String[] args) { 
    createBoard(3,3); 
    int turn = 0; 
    int playerVal; 
    int outcome; 
    java.util.Scanner scan = new java.util.Scanner(System.in); 
    do { 
        displayBoard(); 
        playerVal = (turn % 2 == 0)? NOUGHT : CROSS; 
        if (playerVal == NOUGHT) { 
            System.out.println ("\n-0's turn-"); 
        } else { 
            System.out.println("\n-X's turn-"); 
        } 
        System.out.print("Enter row and Column:"); 
        try { 
            // 先检查输入是否是整数,避免直接解析出错
            if (!scan.hasNextInt()) {
                // 读取无效输入并丢弃,同时抛出明确的错误提示
                String badInput = scan.next();
                throw new IllegalArgumentException("输入无效:" + badInput + ",请输入整数格式的行号和列号");
            }
            int row = scan.nextInt();
            if (!scan.hasNextInt()) {
                String badInput = scan.next();
                throw new IllegalArgumentException("列号输入无效:" + badInput + ",请输入整数");
            }
            int col = scan.nextInt();
            // 若你的set方法是用单个位置值(比如1-9对应棋盘格子),改成读取一个整数即可
            // 示例:int position = scan.nextInt(); set(playerVal, position);
            set(playerVal, row, col); // 根据你的实际set方法调整参数
        } catch (java.util.InputMismatchException | IllegalArgumentException ex) {
            System.err.println(ex.getMessage());
            // 清除缓冲区里剩余的无效内容,防止死循环
            scan.nextLine();
        } 
        turn ++; 
        outcome = winOrTie(); 
    } while ( outcome == -2 ); 
    displayBoard(); 
    switch (outcome) { 
        case NOUGHT: 
            System.out.println("0 wins!"); 
            break; 
        case CROSS: 
            System.out.println("X wins!"); 
            break; 
        case 0: 
            System.out.println("Tie."); 
            break; 
    } 
}

关键修改点解释

  • 扩展异常捕获:把InputMismatchException加入catch块,专门处理非整数输入的情况,和原有的IllegalArgumentException一起处理
  • 提前检查输入有效性:用scan.hasNextInt()先判断下一个输入是否是整数,避免直接调用nextInt()抛出异常,还能给出更明确的错误提示
  • 清理缓冲区:遇到无效输入时,用scan.nextLine()清空缓冲区里剩下的内容,不然下次读取还会读到同样的无效内容,导致程序一直报错循环
  • 更友好的错误提示:告诉用户具体哪里错了,比如是输入了X这种无效内容,还是列号没输入对

如果你的set方法原本是用单个数字表示棋盘位置(比如1-9对应3x3格子),只需要把读取逻辑改成读一个整数就行,核心的异常处理逻辑完全通用。

这样修改后,不管用户输入X还是其他非整数内容,程序都不会崩溃,而是会给出清晰的错误提示,让用户重新输入,完美解决你的问题!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:54:30