¿Por qué Java no me deja asignar un valor a una variable final en un bloque catch después de establecer el valor en el bloque try, incluso si no es posible para que se escriba el valor final en caso de una excepción.Asignación de un valor predeterminado a una variable final en caso de una excepción en Java
Aquí es un ejemplo que muestra el problema:
public class FooBar {
private final int foo;
private FooBar() {
try {
int x = bla();
foo = x; // In case of an exception this line is never reached
} catch (Exception ex) {
foo = 0; // But the compiler complains
// that foo might have been initialized
}
}
private int bla() { // You can use any of the lines below, neither works
// throw new RuntimeException();
return 0;
}
}
El problema no es difícil de evitar, pero me gustaría entender por qué el compilador no acepta esto.
¡Gracias de antemano por cualquier entrada!
Bueno, si está captando la 'Excepción' general, ¿podría ocurrir algo después/durante 'foo = x' que arrojaría una excepción? ¿Tal vez el compilador está "jugando a lo seguro"? – FromCanada
Bueno, esa es la pregunta. Pero realmente dudo que una tarea pueda dar como resultado una excepción lanzada y todavía escribir un valor a la variable. – Alfonso
Donde dices "En caso de una excepción, esta línea nunca se alcanza" Sospecho que el compilador se niega a conocer tus intenciones hasta ese nivel de granularidad. Entonces todo lo que ve es que se le asigne dos veces. Quizás la razón es que esto permite al compilador optimizar el código para foo = bla(), ya que x es finalmente superfluo. Solo especulando. – greim