我可以将 return 语句放在 switch 语句中吗?

Posted

技术标签:

【中文标题】我可以将 return 语句放在 switch 语句中吗?【英文标题】:Can I put a return statement inside a switch statement? 【发布时间】:2013-07-31 10:15:48 【问题描述】:

我可以有一个switch 语句来决定返回什么吗?例如,我想根据我的随机生成器提出的内容返回不同的内容。 Eclipse 给了我一个错误,希望我将 return 语句放在 switch 之外。

我的代码:

public String wordBank()  //Error here saying: "This method must return a type of string"
    String[] wordsShapes = new String[10];
    wordsShapes[1] = "square";
    wordsShapes[2] = "circle";
    wordsShapes[3] = "cone";
    wordsShapes[4] = "prisim";
    wordsShapes[5] = "cube";
    wordsShapes[6] = "cylinder";
    wordsShapes[7] = "triangle";
    wordsShapes[8] = "star";
    wordsShapes[9] = "moon";
    wordsShapes[10] = "paralellogram";

    Random rand = new Random();
    int i = rand.nextInt(11);

    if (i == 0) 
        i = rand.nextInt(11);
    

    switch (i) 
    case 1:
        return wordsShapes[1].toString();
    case 2:
        return wordsShapes[2].toString();
    case 3:
        return wordsShapes[3].toString();
    case 4:
        return wordsShapes[4].toString();
    case 5:
        return wordsShapes[5].toString();
    case 6:
        return wordsShapes[6].toString();
    case 7:
        return wordsShapes[7].toString();
    case 8:
        return wordsShapes[8].toString();
    case 9:
        return wordsShapes[9].toString();
    case 10:
        return wordsShapes[10].toString();
    

【问题讨论】:

Switch statement with returns -- code correctness的可能重复 您已经声明了一个包含 10 个 String 对象的数组,但是您已经将一个 String 分配给了数组 (wordsShapes[10]) 中的 ELEVENTH 位置 - 数组索引是0-(n-1),而不是 1-n。我很惊讶编译器没有因此产生错误。 【参考方案1】:

return 语句将从使用它的整个函数返回。所以我认为如果你想在 switch 中使用 return 语句,那么在 switch 下方不必有其他有用的代码行是好的。

【讨论】:

【参考方案2】:

您可以将return 放在switch 中,但在这种情况下您不需要使用switch

【讨论】:

【参考方案3】:

问题不在于您在 switch 语句中包含 return 语句,这非常好,但您在 switch 语句之后没有 return 。如果你的 switch 语句完成后没有返回,现在会发生什么?

Java 的规则要求通过值返回函数的所有路径都遇到return 语句。在您的情况下,即使 知道 i 的值总是会导致开关出现 return 的值,但 Java 编译器还不够聪明,无法确定这一点。

(旁白:顺便说一句,您实际上并没有阻止生成值 0;也许您的 if 应该是 while。)

附录:如果您有兴趣,这里有一个实现。请参阅http://ideone.com/IpIwis 以获取实时示例。

import java.util.Random;
class Main 
    private static final Random random = new Random();

    private static final String[] SHAPES = 
        "square", "circle", "cone", "prism", "cube", "cylinder", "triangle",
        "star", "moon", "parallelogram"
    ;

    public static String randomShapeWord() 
        return SHAPES[random.nextInt(SHAPES.length)];
    

    public static void main(String[] args) 
        for (int i = 0; i < 20; i++) 
            System.out.println(randomShapeWord());
        
    

注意在函数外部定义随机数生成器的最佳实践。

【讨论】:

我应该使用类似else if 的声明还是只使用return null Java 中有一个default 的情况。但是,请参阅 Ramon 的回答,了解您应该 做什么。 :) 感谢您提供有关 if 语句没有发现的说明:) 没问题。不过,最好拥抱零,而不是回避它。从 0 开始索引您的形状名称,那么您将不需要特殊的游戏。我为您添加了一个可行的示例。玩得开心。【参考方案4】:

抱歉,既然如此,何不干脆做:

return wordsShapes[i].toString();

这样你就可以避免切换和所有。

希望对你有帮助,

【讨论】:

以上是关于我可以将 return 语句放在 switch 语句中吗?的主要内容,如果未能解决你的问题,请参考以下文章

VB.NET 将 Select Case 语句堆叠在一起,就像在 Switch C#/Java 中一样

我可以使用带有两个变量的 case/switch 语句吗?

在Switch语句中使用.StartsWith?

第五次电源操作比switch语句执行得更快

两种风格的C#switch-return语句,有什么区别? [关闭]

switch多分支语句