2012-06-22 77 views
21
public class Foo { 
    public static void main(String[] args) { 
     float f; 
     System.out.println(f); 
    } 
} 

La sentencia de impresión hace que el siguiente error en tiempo de compilación,Java: ¿Por qué debo inicializar una variable local primitiva?

La variable local f puede no haber sido inicializado

Si primitivos en Java ya tienen un default value (float = 0.0f), ¿por qué estoy obligado para definir uno?


Editar:

Por lo tanto, esto funciona

public class Foo { 
    float f; 
    public static void main(String[] args) { 
     System.out.println(new Foo().f); 
    } 
} 

Gracias a todos!

+6

re la edición: sí que funciona, pero promocionar un local en un campo para evitar la inicialización podría no ser un ejemplo razonable :-) – fvu

+1

@fvu, es un ejemplo, por lo que sirve para algún propósito. : D – user1329572

Respuesta

41

Porque es una variable local. Es por eso que no tiene asignada ninguna función:

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 se declara, asegúrese de asignarle un valor antes de intentar usarlo. El acceso a una variable local no inicializada dará como resultado un error en tiempo de compilación.

Editar: ¿Por qué Java plantea este error de compilación? Si nos fijamos en el archivo IdentifierExpression.java clase, nos 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 ha dicho (if (!vset.testVar(local.number)) {), los controles de JDK (con testVar) si se asigna la variable (Vset's source code donde podemos encontrar testVar código) Si no es así, se plantea el error var.not.initialized de un properties file:

... 
javac.err.var.not.initialized=\ 
    Variable {0} may not have been initialized. 
... 

Source

+5

¡Oh vaya, aprendí algo totalmente nuevo hoy! : D – user1329572

+1

Esto realmente no * explica * "por qué", ¿verdad? – kryger

+1

@kryger Por favor, mira la edición. – Zakaria

5

Los campos de clase (no de final de todos modos) se inicializan a los valores predeterminados. Las variables locales no son

No siempre es necesario asignar un valor cuando se declara un campo. Los campos declarados pero no inicializados se establecerán en un valor razonable predeterminado por el compilador.

lo tanto un campo (no final) como f en

class C { 
    float f; 
} 

se inicializará a 0f pero la variable local en f

void myMethod() { 
    float f; 
} 

no será.

Las variables locales son tratadas de manera diferente de los campos por 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.

+1

+1, ¡Gran información sobre el bit no 'final '! : D – user1329572

13

De hecho, el compilador no asignar un valor predeterminado a su float f, porque en este caso se trata de 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. El acceso a una variable local no inicializada dará como resultado un error en tiempo de compilación.

2

las variables locales realidad se almacenan en stack.Hence existe la posibilidad de tomar cualquier valor antiguo presentes en la variable.It locales es un gran desafío por razones de seguridad. Por lo tanto, Java dice que debe inicializar una variable local antes de su uso.

1

Hola, la solución es simple. los valores que están almacenados en la memoria del montón son inicializados por el tipo de datos basado en el compilador, pero las variables locales se almacenan en la memoria de la pila, por lo que debemos inializarlo explícitamente.

Cuestiones relacionadas