确定的变量赋值

时间:2017-11-10 20:47:15

标签: java if-statement java-8 initialization

这是参考变量的明确赋值,其中编译器检查局部变量k的初始化器错误。

void flow(boolean flag) {
    int k;
    if (flag)
        k = 3;
    if (!flag)
        k = 4;
    System.out.println(k); 
}

这段代码抛出了编译错误:

  

k需要初始化。

在下面的场景中,无论flag变量的值是什么,都会分配k变量的值。这个编译错误在这里是否合理?

2 个答案:

答案 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); 
}