Java switch语句的奇怪语义

Java switch语句的奇怪语义,java,switch-statement,Java,Switch Statement,我遇到了switch语句的这种变体,我想知道在巫婆的情况下它可以被使用吗 奇怪的是,它在默认值之前没有案例,只有在默认值之后才有案例。并且没有break语句。但效果很好 以下是代码: public static Item newItem() { switch (rand.nextInt(3)) { default: case 0: return new Scissors(); case 1: return new Paper();

我遇到了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请不要愚蠢地解释
开关是如何工作的。很清楚。只写这个明确的例子


顺便说一句我在遇到了这种代码的平静。

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

默认的
分支仅表示“未明确指定的所有选项的分支。通常将其放在
开关盒
语句的末尾,但不是必需的


中断
也不是必需的-如果
开关盒的分支
没有以
中断
结束,它将继续在下一个分支中执行代码-这称为故障排除。但是,这里不需要它,因为每个分支只返回
,因此函数的执行不会继续。

中断
是可选的。如果案例匹配且未遇到
中断
,则在不进行测试的情况下执行以下
案例
。这就是原因

case 0:
default:
  // Some code here
按你的期望工作

<代码>默认是特殊的。如果没有其他<代码> CASE < /C>匹配,它将被执行。不管你放在哪里(在开始时,在中间,或者在结尾处是(自定义))。


在您的代码中,如果
case 0:
匹配,则不会执行
case 1:
,这仅仅是因为函数永远不会执行得太远:而是返回一个
新剪刀()

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

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

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

该方法应该返回一个值,正如该方法声明的那样,因此它应该有一个
return
语句。如果注释
Default
,该方法可能不会返回该值。将
Default
放在何处并不重要,但是您应该这样做以满足返回条件。

可能重复的
return
会导致开关退出该方法,因此不会执行以下任何选项。@OliverCharlesworth我们有返回语句,因此不需要任何
break
语句。但为什么要在默认语句之后。无论将放在何处ode>default
语句。尽管通常将其放在
开关的末尾。