Я пытался придумать неясные тестовые примеры для альтернативной 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, «попытка» вернуть (в первый раз), а затем выполнить finally, которое на самом деле возвращает , Тем не менее, javac жалуется, что «а», возможно, не было инициализировано:
Test.java:8: variable a might not have been initialized
return a;
^
Единственное, о чем я могу думать, это может вызвать / разрешить другой путь к коду, если неясное исключение времени выполнения возникло после начала попытки, но до того, как значение 1 было присвоено - что-то похожее на OutOfMemoryError или StackOverflowException, но я не могу вспомнить ни одного случая, когда это могло бы произойти в этом месте кода.
Может кто-нибудь, более знакомый со спецификой стандарта Java, пролить свет на это? Является ли это просто случаем, когда компилятор консервативен - и поэтому отказывается компилировать то, что в противном случае было бы допустимым кодом - или здесь происходит что-то более странное?