嵌套交换机语句中缺少返回语句

时间:2017-03-27 01:34:31

标签: java switch-statement return case

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

它抛出一个" Missing Return Statement"在我最后一刻。有什么建议吗?

P.S。对于computerMove和playerMove,唯一可用的选项是R,P和S!

3 个答案:

答案 0 :(得分:1)

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

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

如果computerMove没有,则您希望逻辑流退出外部switch语句,而不是落到下一个case(尽管从技术上讲它们都是只是落后,但仍然如此),所以在每个外部break添加case

如果爆发,或者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);
    }
}

答案 1 :(得分:0)

我的建议

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

答案 2 :(得分:0)

非常感谢大家!我决定简单地将每个switch语句中的一个case设置为default(跟踪它当然是哪个char)并解决了这个问题。

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