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

如何正确使用Java标签替代goto语句实现井字棋控制逻辑

Java实现goto对应跳转逻辑的方案

Java并未实现通用goto语法,标签仅可配合break/continue用于循环/代码块的跳出、重试操作,完全可以覆盖你需要的跳转需求,以下是两种可行实现:

方案1:带标签的continue(改动最小)

你需要的goto label逻辑是回到读取输入的起点重试,直接给原有代码块外层加循环标签,将goto label替换为continue 标签名即可,修改后代码如下:

try {
    out.append(m + "\n");
    // 定义重试标签
    inputRetry:
    while (true) {
        out.append("Enter a move for " + m.getTurn().toString() + ":\n");
        String element1 = scan.next();
        if (quitGameHelper(element1, m)) {
            return;
        }
        String regex = "[-+]?\\d+";
        while (!Pattern.matches(regex, element1)) {
            if (quitGameHelper(element1, m)) {
                return;
            }
            out.append("Not a valid number: " + element1 + "\n");
            // 替换原有goto,回到标签位置重试
            continue inputRetry;
        }

        String element2 = scan.next();
        if (quitGameHelper(element2, m)) {
            return;
        }
        while (!Pattern.matches(regex, element2)) {
            if (quitGameHelper(element2, m)) {
                return;
            }
            out.append("Not a valid number: " + element2 + "\n");
            continue inputRetry;
        }

        int element1Int = Integer.parseInt(element1) - 1;
        int element2Int = Integer.parseInt(element2) - 1;
        try {
            m.move(element1Int, element2Int);
            out.append(m + "\n");
        } catch (IllegalArgumentException e) {
            out.append("Not a valid move: " + (element1Int + 1) + ", " + (element2Int + 1) + "\n");
            // 落子无效也可加continue重试
            continue inputRetry;
        }

        final boolean gameOver = m.isGameOver();
        if (gameOver) {
            final Player winner = m.getWinner();
            if (winner == null) {
                out.append("Game is over! Tie game.");
            } else {
                out.append("Game is over! " + winner + " wins.");
            }
            return;
        }
    }
} catch (IOException e) {
    // 原有异常处理逻辑
}

方案2:抽取输入逻辑为单独方法(更推荐)

把输入校验、落子的逻辑抽成独立方法,用方法返回值控制是否需要重试,完全不需要显式跳转,代码可读性和可维护性更高:

第一步:抽取处理方法

// 返回true代表输入有效、落子成功;返回false代表需要重新输入
private boolean tryProcessMove(Model m, Scanner scan, Appendable out) throws IOException {
    String regex = "[-+]?\\d+";
    String element1 = scan.next();
    if (quitGameHelper(element1, m)) {
        System.exit(0); // 也可返回特殊标记通知上层直接退出
    }
    if (!Pattern.matches(regex, element1)) {
        out.append("Not a valid number: " + element1 + "\n");
        return false;
    }

    String element2 = scan.next();
    if (quitGameHelper(element2, m)) {
        System.exit(0);
    }
    if (!Pattern.matches(regex, element2)) {
        out.append("Not a valid number: " + element2 + "\n");
        return false;
    }

    int element1Int = Integer.parseInt(element1) - 1;
    int element2Int = Integer.parseInt(element2) - 1;
    try {
        m.move(element1Int, element2Int);
        out.append(m + "\n");
    } catch (IllegalArgumentException e) {
        out.append("Not a valid move: " + (element1Int + 1) + ", " + (element2Int + 1) + "\n");
        return false;
    }
    return true;
}

第二步:替换原有逻辑

try {
    out.append(m + "\n");
    while (true) {
        out.append("Enter a move for " + m.getTurn().toString() + ":\n");
        // 输入失败就循环重试
        if (!tryProcessMove(m, scan, out)) {
            continue;
        }
        // 落子成功后判断游戏是否结束
        final boolean gameOver = m.isGameOver();
        if (gameOver) {
            final Player winner = m.getWinner();
            if (winner == null) {
                out.append("Game is over! Tie game.");
            } else {
                out.append("Game is over! " + winner + " wins.");
            }
            return;
        }
    }
} catch (IOException e) {
    // 原有异常处理逻辑
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 04:24:05