java - 为什么枚举上的开关需要默认值?

标签 java enums default switch-statement

通常,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,但如果您只有 caseAB 定义标签,那么如果您传入其他任何内容,该函数将不会返回值。 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/

相关文章:

java - 在 switch-case 中切换到默认情况

javascript - 如果绑定(bind)空/未定义(带过滤器),Angularjs模板默认值

java - 如何将 ASCII 编码的 SHA1 哈希(40 字节十六进制字符串)从 40 字节转换为 20 字节?

java - 使网络密集型代码更加健壮

ios - 如何使用枚举制作切换开关

c - 我应该使用什么类型来表示 C 枚举的二进制?

java - 将整个句子与正则表达式匹配

java - PrimeFaces 3.0 - 如何覆盖对话框覆盖的默认不透明度?

c# - 枚举和字典<枚举, Action >

postgresql - 插入默认值