3

次のコードでは、変数と最後のelseブロックを初期化する必要はないと思いますが、コンパイラはそれを好みません。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

が false に設定されている場合、コンパイラは静的分析を実行してk評価されないことを確認できると考えていました。cだから私の質問は、なぜコンパイラは私が初期化することを要求するのaですbか?

4

1 に答える 1

7

コンパイラは、ブロックを通過するelseと に設定さcfalse、次のifブロックが実行されないことを理解するほど賢くありません。静的分析は予想よりも制限されているため、コンパイルも高速になります/

elseブロックのコードを変更すると、突然次のifブロックがコンパイルできなくなり、迷惑になるため、これはおそらく良いことです。

于 2012-05-17T09:53:52.533 に答える