Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.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 并非所有情况都被打开枚举覆盖_Java_Enums_Switch Statement - Fatal编程技术网

Java 并非所有情况都被打开枚举覆盖

Java 并非所有情况都被打开枚举覆盖,java,enums,switch-statement,Java,Enums,Switch Statement,我有[大量的代码可以提炼成]这样: class Test { enum Bool { False, True }; static boolean decode(Bool input) { boolean b; switch (input) { case False: b = false; break; case True: b = true; break; } r

我有[大量的代码可以提炼成]这样:

class Test {
    enum Bool { False, True };

    static boolean decode(Bool input) {
        boolean b;
        switch (input) {
            case False: b = false; break;
            case True:  b = true;  break;
        }
        return b;
    }
}
javac
拒绝该协议,理由是:

Main.java:11: error: variable b might not have been initialized
    return b;

我有点困惑。我认为
enum
s的要点是在编译时固定值列表。在什么情况下,我的变量
b
可能没有初始化?

这是因为
输入可能为空。然后,开关盒将不会初始化它。修复方法是使
部分默认为空

static boolean decode(Bool input) {
    boolean b;
    switch (input) {
        case False: b = false; break;
        case True:  b = true;  break;
        default: b = false; // you can make it true too.
    }
    return b;
}
因为我没有测试它,我不知道它是否编译。如果没有,只需在开始时初始化
b

static boolean decode(Bool input) {
    boolean b = false;
    switch (input) {
        case False: b = false; break;
        case True:  b = true;  break;
    }
    return b;
}

这是因为
输入
可能为空。然后,开关盒将不会初始化它。修复方法是使
部分默认为空

static boolean decode(Bool input) {
    boolean b;
    switch (input) {
        case False: b = false; break;
        case True:  b = true;  break;
        default: b = false; // you can make it true too.
    }
    return b;
}
因为我没有测试它,我不知道它是否编译。如果没有,只需在开始时初始化
b

static boolean decode(Bool input) {
    boolean b = false;
    switch (input) {
        case False: b = false; break;
        case True:  b = true;  break;
    }
    return b;
}

<>编译器不考虑开关语句的分支,除非有缺省子句。枚举上的开关也不例外。就像您编写了一系列
if
/
else-if
语句一样,除非您有一个最后的裸
else
子句,否则它们不会是详尽的,即使你检查的条件在逻辑上是互补的。

< P>编译器不考虑开关语句的分支是穷尽的,除非有一个缺省子句。枚举上的开关也不例外。就像您编写了一系列
if
/
else-if
语句一样,除非您有一个最后的裸
else
子句,否则它们不会是详尽的,即使您正在检查的条件在逻辑上是互补的。

在编译后和运行程序之前,有人可能更改
Test$Bool.class
文件,因此,在不存在缺省子句的情况下,编译器不考虑开关语句的分支穷尽性。枚举上的开关也不例外。就像你写了一系列的
if/else-if
语句一样,除非你有一个最后的裸
else
子句,否则这些语句不会是详尽无遗的。@khelwood:尽管它不令人满意,但如果它是一个答案,我也会接受。@JB。很公平。答案已发布。我建议抛出一个
非法状态异常
,而不是在默认分支中赋值。如果向枚举中添加另一个值,则可以更快地找到错误(如果忘记编辑switch语句)(请参阅:)有人可以在编译后和运行程序之前更改
Test$Bool.class
文件,因此,在不存在缺省子句的情况下,编译器不考虑开关语句的分支穷尽性。枚举上的开关也不例外。就像你写了一系列的
if/else-if
语句一样,除非你有一个最后的裸
else
子句,否则这些语句不会是详尽无遗的。@khelwood:尽管它不令人满意,但如果它是一个答案,我也会接受。@JB。很公平。答案已发布。我建议抛出一个
非法状态异常
,而不是在默认分支中赋值。如果您向枚举中添加另一个值,您将能够更快地找到错误(如果您忘记编辑switch语句)(请参阅:)如果为null,我希望它触发开关上的NPE(或第一次比较),但不会到达返回值。如果为null,我希望它触发开关上的NPE(或第一次比较),但不会到达返回值。