【问题标题】:Missing Return Statement in Nested Switch Statements嵌套 switch 语句中缺少 return 语句
【发布时间】:2017-03-27 01:34:31
【问题描述】:

我正在为 Rock, Paper, Scissors 游戏编写一段代码。我正在编写一个返回 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!

【问题讨论】:

  • 添加默认情况并执行一些错误处理
  • 如果playerMove 不是'R''P''S' 会发生什么?请记住,就编译器所知,它可以有任何字符值。在方法末尾添加throw new IllegalStateException("Oops! I messed up!!")
  • 编译器不知道唯一可用的选项是RPS。从它的角度来看,他们可以是任何其他角色。
  • 好的,谢谢大家,我尝试了所有建议,如果我尝试任何修复,似乎都无法修复弹出的错误集群,我认为这是整个程序的错误,而不是我正在处理的部分。谢谢大家!
  • 我建议你只使用带有嵌套 if 的 if-else 结构

标签: java switch-statement return case


【解决方案1】:

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

但是,您需要考虑如果playerMove 和/或computerMove 没有三个预期值之一('R''P''S')会发生什么。

如果computerMove 没有,您会希望逻辑流退出外部switch 语句,而不是进入下一个case(虽然从技术上讲,它们都只是通过,但是仍然),所以在每个外部case 中添加一个break

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

这里最好的解决方案是声明它是异常,即throwException

你的代码可能是:

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);
}

现在,您可以将这些 throw 语句添加到 default 子句中。结果一样。

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);
    }
}

【讨论】:

    【解决方案2】:

    我的建议

    public static void main(String[] args)
            {
                Scanner scan = new Scanner(System.in);
    
                int x=nextPlay('R','P');
                System.out.println(x);
            }
            private static int nextPlay(char computerMove, char playerMove) 
            {
                if(playerMove=='R')
                {
                    if(computerMove=='R')
                        return 0;
                    else if(computerMove=='P')
                        return 1;
                    else
                        return -1;
                }
                else if(playerMove=='P')
                {
                    if(computerMove=='R')
                        return -1;
                    else if(computerMove=='P')
                        return 0;
                    else
                        return 1;
                }
                else
                {
                    if(computerMove=='R')
                        return 1;
                    else if(computerMove=='P')
                        return -1;
                    else
                        return 0;
                }
            }
    

    【讨论】:

      【解决方案3】:

      非常感谢大家!我决定简单地将每个 switch 语句中的一种情况设置为默认值(当然要跟踪它是哪个字符),它解决了这个问题。

      我知道如果字符不是预期的字符,这可能会导致一些问题,但我的老师说没关系,下次我会使用不同的方法(如建议的那样)!

      【讨论】: