javac中的流量分析 - 变量a可能尚未初始化

时间:2012-05-17 09:46:33

标签: java javac

在下面的代码中,我希望在最后一个块中初始化变量ab时应该,但编译器不喜欢它

import java.util.Random;

public class Foo {

    private void foo () {

    double a,b;
    boolean c;

    double r = (new Random()).nextDouble();

    if(r < 0.25) {
        a = 1;
        b = 2;
        c = true;
    } else if(r >= 0.25 && r < 0.75) {
        a = 3;
        b = 3;
        c = true;
    } else {
        // why is it necessary to init a and b here?
        // given that c is set to false
        c = false;
    }

    if(c) {
        double k = a + b;
    }

  }

}

使用上面的代码,编译器抱怨。

bash-3.2$ javac Foo.java
Foo.java:25: variable a might not have been initialized
        double k = a + b;
                   ^
Foo.java:25: variable b might not have been initialized
        double k = a + b;
                       ^
2 errors

我原本认为编译器可以进行静态分析,以确定k设置为false时不会评估c。所以我的问题是为什么编译器要求我初始化ab

1 个答案:

答案 0 :(得分:7)

编译器不够智能,无法理解通过else块会将c设置为false,因此下一个if块不会永远被执行静态分析比您期望的更有限,这也使得编译更快/

这可能是一件好事,因为更改else块的代码会突然使下一个if块无法编译,这会很烦人。