繁体   English   中英

嵌套切换语句中缺少返回语句

[英]Missing Return Statement in Nested Switch Statements

我正在为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;
        }
    }
}

在最后一个括号中,它向我抛出了“丢失的返回声明”。 有什么建议么?

PS PS仅适用于computerMove和playerMove的选项是R,P和S!

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

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

如果computerMove不这样做,则您希望逻辑流程退出外部switch语句,而不是进入下一个case (尽管从技术上讲,它们都只是到那时为止,但仍然如此),因此请在每个情况中添加一个breakcase

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

最好的解决方法是,声明您是例外情况 ,即throw 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);
}

现在,您可以将这些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);
    }
}

我的建议

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM