¿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.

Author: PrashanD, 0000-00-00

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.

 26
Author: assylias,
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
 45
Author: ,
Warning: date() expects parameter 2 to be long, string given in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61