Estaba tratando de encontrar casos de prueba oscuros para una JVM de código abierto alternativa con la que estoy ayudando (Avian) cuando encontré un código de código interesante, y me sorprendió que no funcionara 't compilación:variable no inicializada de Java con curiosidad por fin
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();
}
}
la ruta de código más obvia (el único que veo) es ejecutar a = 1, 'intento' para devolver una (la primera vez), luego ejecutar el último, el que en realidad devuelve a. Sin embargo, javac se queja de que "a" puede que no se han inicializado:
Test.java:8: variable a might not have been initialized return a; ^
La única cosa que puedo pensar en que podría causar/liberar una ruta de código diferente es si una excepción de tiempo de ejecución oscura se produjera después del inicio de el intento, pero antes de que el valor 1 se asigne a un - algo parecido a un OutOfMemoryError o StackOverflowException, pero no puedo pensar en ningún caso donde esto podría ocurrir en este lugar en el código.
¿Alguien más familiarizado con los detalles del estándar Java arroja algo de luz sobre esto? ¿Es solo un caso en el que el compilador es conservador y, por lo tanto, se niega a compilar lo que de otro modo sería un código válido, o algo extraño sucede aquí?
+1 Este es un buen punto. –
Estaba haciendo mi mejor esfuerzo para ejercitar el código de jSR (Jump SubRoutine) en Avian (para esto, tuve que usar ECJ, porque sun javac raramente genera JSRs más), y el caso de prueba del que condensé este ejemplo fue significativamente más Complicado.Estoy muy consciente de la inutilidad de dicho código, pero si se puede compilar, Avian debe ejecutarlo correctamente. –