Local variables are much easier to check that a variable is always initialised in a relatively limited scope when you can determine the code paths. It doesn't always get it right but does a good job unless the code is confusing.
final
fields also have to be initialised, though only once. When one constructor calls another, it can get confused.
For non final fields, it is very hard to ensure a field is initialised before it is used for all possible code paths. e.g. how can it ensure a setter
is always called before a getter
if those calls are made from another class which might be changed in the future.
Instead the JVM leaves default values and makes it your problem to worry about.