Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么,当switch语句中的每个enum常量都有实例时,我还必须提供默认值?_Java_Enums - Fatal编程技术网

Java 为什么,当switch语句中的每个enum常量都有实例时,我还必须提供默认值?

Java 为什么,当switch语句中的每个enum常量都有实例时,我还必须提供默认值?,java,enums,Java,Enums,我试图在Java中声明一个枚举,并在switch语句中使用该类型的变量,其中涵盖了该类型枚举常量的所有可能情况 enum MyEnum { FOO, BAR } private static void test(MyEnum e) { String msg; switch (e) { case FOO: msg = "foo"; break; case BAR:

我试图在Java中声明一个枚举,并在switch语句中使用该类型的变量,其中涵盖了该类型枚举常量的所有可能情况

enum MyEnum {
    FOO, 
    BAR
}

private static void test(MyEnum e) {
    String msg;
    switch (e) {
        case FOO:
            msg = "foo";
            break;
        case BAR:
            msg = "bar";
            break;
    }
    System.out.println("Enum is: " + e + " msg is: " + msg); //compiler error
}

为什么编译器无法检测到此开关将始终初始化
msg
(或者因为
e
null
而引发NullPointerException)?

想象一下如果
MyEnum
是一个单独的类。然后可以重新编译
MyEnum
类,并添加新值,而无需重新编译
EnumSwitchTest
(这样就不会出现任何错误)


然后,另一个类可以使用新值调用
test

我不知道一个可以使用switch语句的解决方案,但是您可以使用,它提供了一个注释处理器,可以确保在编译时处理所有枚举常量。我想这和你要求的结果是一样的


此外,它还支持反向查找和部分映射程序。

可以使用一些反射开关创建枚举的新实例。@immibis即使可能,编译器也不必为此费心。大多数编译器都能够检测到这一点,但是Java语言规范不允许他们中止编译。相反,它只是一个关于枚举值缺少开关案例的警告。在编译时无法强制使用switch/case单独覆盖所有案例。如果必须为所有枚举常量返回一个值,例如,可以将该值设置为枚举的字段。