这是参考变量的明确赋值,其中编译器检查局部变量k
的初始化器错误。
void flow(boolean flag) {
int k;
if (flag)
k = 3;
if (!flag)
k = 4;
System.out.println(k);
}
这段代码抛出了编译错误:
k
需要初始化。
在下面的场景中,无论flag
变量的值是什么,都会分配k
变量的值。这个编译错误在这里是否合理?
答案 0 :(得分:2)
是的,无论状态如何,变量k
都将被初始化。但是,因为两个if
条件彼此不相关,因此编译器无法保证变量k
将在时间控件到达println
方法调用时初始化。 / p>
我假设你知道手头问题的解决方法,但如果不是这样,你只需删除第二个if
语句,然后将else
块链接到第一个if
声明。
答案 1 :(得分:2)
这是因为编译器不会检查非最终字段的所有可能值(此处为flag
)。
编译器只能分析编译时常量并确认是否初始化局部变量。
Java语言规范中的更多内容:https://docs.oracle.com/javase/specs/jls/se7/html/jls-16.html
考虑同一方法的另外两种变体......
这里,即使编译器知道flag的值,也会为变量k抛出编译器错误。
void flow() {
boolean flag = false;
int k;
if (flag)
k = 3;
if (!flag)
k = 4;
System.out.println(k);
}
这里,flag是一个编译时常量,编译器可以计算变量k和的值,因此无编译错误。
void flow() {
final boolean flag = false;
int k;
if (flag)
k = 3;
if (!flag)
k = 4;
System.out.println(k);
}