通常,switch 语句中不需要 default。但是,在以下情况下,只有当我取消注释默认语句时,代码才能成功编译。谁能解释一下为什么吗?
public enum XYZ {A,B};
public static String testSwitch(XYZ xyz)
{
switch(xyz)
{
case A:
return "A";
case B:
//default:
return "B";
}
}
最佳答案
您必须取消注释 default
的原因是您的函数表示它返回一个 String
,但如果您只有 case
为 A
和 B
定义标签,那么如果您传入其他任何内容,该函数将不会返回值。 Java 要求所有声明返回值的函数实际上在所有可能的控制路径上返回一个值,并且在您的情况下,编译器不相信所有可能的输入都有一个返回值。
我相信(并且我不确定这一点)其原因是即使您涵盖了所有 enum
情况,代码在某些情况下仍然可能会失败。特别是,假设您编译包含此 switch 语句的 Java 代码(效果很好),然后更改 enum
以便现在有第三个常量 - 比方说 C
- 但您不会使用其中的 switch
语句重新编译代码。现在,如果您尝试编写使用先前编译的类并将 C
传递到此语句中的 Java 代码,那么该代码将不会返回值,这违反了所有函数始终遵循的 Java 约定返回值。
从技术上讲,我认为真正的原因是 JVM 字节码 validator 总是拒绝某些控制路径从函数末尾脱落的函数(参见 §4.9.2 of the JVM spec ),因此如果无论如何,要编译的代码在运行时都会被 JVM 拒绝。因此,编译器会向您报告存在问题的错误。
关于java - 为什么枚举上的开关需要默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56347341/