興味深いコードに出くわしたとき、私が支援している代替のオープンソース JVM ( Avian )のあいまいなテストケースを考え出そうとしていましたが、コンパイルされなかったことに驚きました:
public class Test {
public static int test1() {
int a;
try {
a = 1;
return a; // this is fine
} finally {
return a; // uninitialized value error here
}
}
public static void main(String[] args) {
int a = test1();
}
}
最も明白なコード パス (私が目にする唯一のもの) は、a = 1 を実行して a を返すように "試行" し (初めて)、最後に実際に a を返すを実行することです。ただし、 javac は、「a」が初期化されていない可能性があると不平を言っています。
Test.java:8: 変数 a が初期化されていない可能性があります を返します。 ^
私が考えることができる唯一のことは、別のコード パスを引き起こす/許可する可能性があるということです。しかし、これらがコードのこの場所で発生する可能性があるケースは考えられません。
Java 標準の詳細に精通している人は、これに光を当てることができますか? これは、コンパイラが保守的であるため、そうでなければ有効なコードであるものをコンパイルすることを拒否しているという単なるケースですか?それとも、ここで何か奇妙なことが起こっているのでしょうか?