¿Por qué el compilador Java no entiende que esta variable siempre se inicializa?
class Foo{
public static void main(String args[]){
final int x=101;
int y;
if(x>100){
y=-1;
}
System.out.println(y);
}
}
El compilador Java entiende que la condición de la instrucción if siempre es verdadera y por lo tanto y siempre se inicializará. No hay error de compilación, como se esperaba.
class Bar{
public static void main(String args[]){
final int x;
x=101;
int y;
if(x>100){
y=-1;
}
System.out.println(y);
}
}
Pero cuando rompo la declaración y la inicialización de x en dos líneas, el compilador no parece entender que la condición siempre es verdadera y que siempre se inicializará y.
final int x;
x=101;
byte b;
b=x;
System.out.println(b);
Lo mismo sucede aquí y el compilador da una pérdida de error de precisión.
final int x=101;
byte b;
b=x;
System.out.println(b);
De nuevo, el compilador puede entiende que x está dentro del rango de b.
2 answers
Tiene que ver con cómo el compilador determina si una instrucción será ejecutada o no. Se define en el JLS #16:
Cada variable local y cada campo final en blanco debe tener un valor definitivamente asignado cuando se produce cualquier acceso a su valor.
En su caso, el compilador no puede determinar que y
ha sido asignado definitivamente y le da un error. Esto se debe a que tendría que determinar que la condición es siempre verdadera y que es solo posible si la condición en el if
es una expresión constante .
JLS #15.28 define expresiones constantes:
Una expresión constante en tiempo de compilación es una expresión que denota un valor de tipo primitivo o una cadena que no se completa abruptamente y se compone utilizando solo lo siguiente:
- [...]
- Nombres simples (§6.5.6.1) que se refieren a variables constantes (§4.12.4).
El JLS # 4.12.4 define constantes variables como:
Una variable de tipo primitivo o cadena de tipo, que es final e inicializada con una expresión constante en tiempo de compilación, se llama variable constante.
En su caso, final int x = 101;
es una variable constante pero final int x; x = 101;
no lo es.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-05 16:36:24