Solución:
Porque es una variable local. Por eso no se le asigna nada:
Las variables locales son ligeramente diferentes; el compilador nunca asigna un valor predeterminado a una variable local no inicializada. Si no puede inicializar su variable local donde está declarada, asegúrese de asignarle un valor antes de intentar usarla. Acceder a una variable local no inicializada resultará en un error en tiempo de compilación.
Editar: ¿Por qué Java genera este error de compilación?
Si miramos el IdentifierExpression.java
class, encontraremos este bloque:
...
if (field.isLocal()) {
LocalMember local = (LocalMember)field;
if (local.scopeNumber < ctx.frameNumber && !local.isFinal()) {
env.error(where, "invalid.uplevel", id);
}
if (!vset.testVar(local.number)) {
env.error(where, "var.not.initialized", id);
vset.addVar(local.number);
}
local.readcount++;
}
...
Como se dijo (if (!vset.testVar(local.number)) {
), el JDK comprueba (con testVar
) si la variable está asignada (Vset
el código fuente donde podemos encontrar testVar
código). Si no, plantea el error. var.not.initialized
desde un archivo de propiedades:
...
javac.err.var.not.initialized=
Variable {0} may not have been initialized.
...
Fuente
De hecho, el compilador no asignar un valor predeterminado a su float f
, porque en este caso es una variable local y no un campo:
Las variables locales son ligeramente diferentes; el compilador nunca asigna un valor predeterminado a una variable local no inicializada. Si no puede inicializar su variable local donde está declarada, asegúrese de asignarle un valor antes de intentar usarla. Acceder a una variable local no inicializada resultará en un error en tiempo de compilación.
Campos de clase (nofinal
unos de todos modos) se inicializan a los valores predeterminados. Las variables locales no lo son.
No siempre es necesario asignar un valor cuando se declara un campo. Los campos que se declaran pero no se inicializan se establecerán en un valor predeterminado razonable por el compilador.
Entonces un (no-final
) campo como f
en
class C {
float f;
}
se inicializará en 0f
pero la variable local f
en
void myMethod() {
float f;
}
no será.
Las variables locales se tratan de forma diferente a los campos según el idioma. Las variables locales tienen una vida útil bien definida, por lo que cualquier uso antes de la inicialización probablemente sea un error. Los campos no lo hacen, por lo que la inicialización predeterminada suele ser conveniente.