¿Por qué el compilador de 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 de Java entiende la condición de la sentencia 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 darse cuenta de que la condición es siempre cierta y y siempre se inicializará.

final int x;
x=101;
byte b;
b=x;
System.out.println(b);

Lo mismo sucede aquí y el compilador da un error de pérdida de precisión.

final int x=101;
byte b;
b=x;
System.out.println(b);

De nuevo, el compilador puede entender que x está dentro del rango de b.

Respuestas a la pregunta(3)

Su respuesta a la pregunta