Внутри процедурный поток данных действительно легко сделать, поэтому очень легко проверить, инициализировано ли поле, и, если нет, выдать предупреждение (можно написать упрощенный алгоритм разрешимого кода, например, убедиться, что все ветвиif
инициализирует переменную, и если одна ветвь этого не делает, происходит сбой, даже если ветка недоступна).
Действительно трудно сделать межпроцедурный поток данных, поэтому очень трудно проверить, было ли поле объекта когда-либо инициализировано где-нибудь в кодевы быстро попадете на неразрешимую территорию для любого разумного приближения).
Таким образом, Java делает первое и выдает ошибки во время компиляции, когда обнаруживает неинициализированные локальные переменные, но не делает последнее и инициализирует поля объекта их значениями по умолчанию.