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(或第一次比较),但不会到达返回值。