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

3
在下面的代码中,我预期不需要在最后一个 else 块中初始化变量 a 和 b,但编译器不允许这样做。
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

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

1个回答

7
编译器并不聪明,无法理解经过“else”块会将“c”设置为“false”,导致下一个“if”块永远不会被执行。静态分析比您期望的更受限制,这也使得编译速度更快。
这可能是一件好事,因为改变“else”块的代码将突然使下一个“if”块无法编译,这会很烦人。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接