Почему компилятор Java не понимает, что эта переменная всегда инициализируется?

class Foo{
    public static void main(String args[]){
        final int x=101;

        int y;
        if(x>100){
            y=-1;
        }
        System.out.println(y);
    }
}

Компилятор Java понимает условие оператора if всегда true и поэтому y всегда будет инициализирован. Нет ошибки компиляции, как ожидалось.

class Bar{
    public static void main(String args[]){
        final int x;
        x=101;

        int y;      
        if(x>100){
            y=-1;
        }
        System.out.println(y);
    }
}

Но когда я разбиваю объявление и инициализацию x на две строки, компилятор, похоже, не понимает, что условие всегда выполняется и y всегда будет инициализироваться.

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

Здесь происходит то же самое, и компилятор выдает ошибку потери точности.

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

Опять же, компилятор может понять, что x находится внутри диапазона b.