switch语句的奇怪语义

时间:2013-12-25 15:23:46

标签: java switch-statement

我遇到了switch语句的这种变化,我想知道在女巫的情况下可以使用它吗?

奇怪之处在于它之前没有默认值之前的情况。而且没有break声明。但工作正常。

这是代码:

public static Item newItem() {
    switch (rand.nextInt(3)) {
    default:
    case 0:
        return new Scissors();
    case 1:
        return new Paper();
    case 2:
        return new Rock();
    }
}

如何以这种奇怪的风格执行它。我试图轻松调试所有工作,它返回准确性一个显式实例。

问题:为什么我们需要写:

default:
case 0: 

代替典型用法:

case 0:
default:

编译器不允许更改或评论default声明。

有什么建议吗?

PS 请不要写愚蠢的解释switch如何运作。很明显。只写这个明确的例子。

BTW 我在Thinking in Java by Bruce Eckel遇到了这种代码的和平。

5 个答案:

答案 0 :(得分:3)

default分支仅表示"未明确指定的所有选项的分支。将它放在switch-case语句的末尾是一种约定,但不是必需的。

break也不是必需的 - 如果switch-case的一个分支没有以break结尾,它将继续执行下一个分支中的代码 - 这称为< EM>下通。但是,在这里你不需要它,因为每个分支只是return s,所以函数的执行不会继续。

答案 1 :(得分:1)

Return导致退出。无需添加break语句。

答案 2 :(得分:0)

break是可选的。如果案例匹配且未遇到break,则执行以下case而不进行测试。这就是为什么

case 0:
default:
  // Some code here

按预期工作。

default案例很特别。如果没有其他case匹配则执行。无论你把它放在哪里(在开头,中间或者最后都是自定义)。

在您的代码中,如果case 0:匹配,则case 1:不会仅因为函数永远不会执行而执行:而是返回new Scissors()

答案 3 :(得分:0)

该方法应返回一个值,如方法所声明的那样,因此它应该有一个return语句。如果您对default发表评论,则该方法可能不会返回该值。放置default的位置并不重要,但是你应该这样做以满足返回条件。

答案 4 :(得分:-2)

可以修改代码以提高可读性和标准外观:

switch(...)
{
  case 0:
    ...
  case 1:
    ...
  case 2:
    ...
  default:
    // Not reachable
    throw new RuntimeException("Unexpected value");
}

默认标签是必要的,因为编译器无法猜测只有0,1和2是可能的。