Saltar al contenido

Java: ¿Por qué debo inicializar una variable local primitiva?

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 (Vsetel 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *