java - 嵌套 Switch 语句中缺少 Return 语句

标签 java switch-statement return case

我正在为石头剪刀布游戏编写一段代码。我正在编写一个方法,根据计算机是否获胜、平局或用户获胜分别返回 1、0 或 -1。到目前为止我有这个代码:

private int nextPlay(char computerMove, char playerMove) {
    switch (playerMove) {
        case 'R': switch (computerMove) {
            case 'R': return 0;
            case 'P': return 1;
            case 'S': return -1;
        }
        case 'P': switch (computerMove) {
            case 'R': return -1;
            case 'P': return 0;
            case 'S': return 1;
        }
        case 'S': switch (computerMove) {
            case 'R': return 1;
            case 'P': return -1;
            case 'S': return 0;
        }
    }
}

它在最后一个括号中向我抛出“缺少返回语句”。有什么建议吗?

附注ComputerMove 和playerMove 唯一可用的选项是R、P 和S!

最佳答案

其他人告诉您将 default 添加到 switch 语句中。在这种情况下根本不需要,尽管这是一个需要遵循的很好的一般规则。

但是,您需要考虑如果 playerMove 和/或 computerMove 不具有 3 个预期值之一('R''P''S')。

如果 computerMove 不这样做,您希望逻辑流退出外部 switch 语句,而不是进入下一个 case(虽然从技术上讲,它们都会失败,但仍然如此),因此在每个外壳中添加一个 break

如果发生这种情况,或者 playerMove 没有有效值,则逻辑流将到达方法末尾,并且那里没有 return 语句。 是你的编译错误。

这里最好的解决方案是,因为您希望不会陷入这种情况,所以将其声明为异常(exception),即抛出一个异常.

您的代码可能是:

private int nextPlay(char computerMove, char playerMove) {
    switch (playerMove) {
        case 'R':
            switch (computerMove) {
                case 'R': return 0;
                case 'P': return 1;
                case 'S': return -1;
            }
            break;
        case 'P':
            switch (computerMove) {
                case 'R': return -1;
                case 'P': return 0;
                case 'S': return 1;
            }
            break;
        case 'S':
            switch (computerMove) {
                case 'R': return 1;
                case 'P': return -1;
                case 'S': return 0;
            }
            break;
    }
    throw new IllegalStateException("Oops! I messed up!!");
}

但最好提供更多描述性错误消息:

private int nextPlay(char computerMove, char playerMove) {
    switch (playerMove) {
        case 'R':
            switch (computerMove) {
                case 'R': return 0;
                case 'P': return 1;
                case 'S': return -1;
            }
            throw new IllegalArgumentException("Invalid computer move: " + computerMove);
        case 'P':
            switch (computerMove) {
                case 'R': return -1;
                case 'P': return 0;
                case 'S': return 1;
            }
            throw new IllegalArgumentException("Invalid computer move: " + computerMove);
        case 'S':
            switch (computerMove) {
                case 'R': return 1;
                case 'P': return -1;
                case 'S': return 0;
            }
            throw new IllegalArgumentException("Invalid computer move: " + computerMove);
    }
    throw new IllegalArgumentException("Invalid player move: " + playerMove);
}

现在,您可以在 default 子句中添加这些 throw 语句。结果相同。

private int nextPlay(char computerMove, char playerMove) {
    switch (playerMove) {
        case 'R':
            switch (computerMove) {
                case 'R': return 0;
                case 'P': return 1;
                case 'S': return -1;
                default: throw new IllegalArgumentException("Invalid computer move: " + computerMove);
            }
        case 'P':
            switch (computerMove) {
                case 'R': return -1;
                case 'P': return 0;
                case 'S': return 1;
                default: throw new IllegalArgumentException("Invalid computer move: " + computerMove);
            }
        case 'S':
            switch (computerMove) {
                case 'R': return 1;
                case 'P': return -1;
                case 'S': return 0;
                default: throw new IllegalArgumentException("Invalid computer move: " + computerMove);
            }
        default: throw new IllegalArgumentException("Invalid player move: " + playerMove);
    }
}

关于java - 嵌套 Switch 语句中缺少 Return 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43036616/

相关文章:

strings.Contains 在 switch-case GoLang 中

android - 切换案例中的 Activity 上下文

安卓:如何返回

java - Rest API json 响应中出现异常完整类名

java - 使用 GIS 获取单个点的地理信息

java - 如何在本地启动 Java Web Start

java - 将字符串转换为对象

perl - 为什么我的正则表达式不能用于 Perl 的 Switch 模块?

Java:void 方法返回值?

比较两个未排序 int 数组的代码。 C