Java: Perché mi viene richiesto di inizializzare una variabile locale primitiva?

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

L’istruzione print causa il seguente errore in fase di compilazione,

La variabile locale f potrebbe non essere stata inizializzata

Se i primitivi in ​​Java hanno già un valore predefinito (float = 0.0f) , perché sono obbligato a definirne uno?


Modificare:

Quindi, questo funziona

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

Grazie a tutti!

Perché è una variabile locale. Questo è il motivo per cui non gli è stato assegnato:

Le variabili locali sono leggermente diverse; il compilatore non assegna mai un valore predefinito a una variabile locale non inizializzata. Se non è ansible inizializzare la variabile locale in cui è stata dichiarata, assicurarsi di assegnargli un valore prima di tentare di utilizzarlo. L’accesso a una variabile locale non inizializzata comporterà un errore in fase di compilazione.

Modifica: Perché Java solleva questo errore di compilazione? Se guardiamo il file di class IdentifierExpression.java , troveremo questo blocco:

 ... 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++; } ... 

Come indicato ( if (!vset.testVar(local.number)) { ), il JDK controlla (con testVar ) se la variabile è assegnata ( il codice sorgente di Vset dove possiamo trovare il codice testVar ). In caso contrario, solleva l'errore var.not.initialized da un file delle proprietà :

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

fonte

Infatti, il compilatore non assegna un valore predefinito al tuo float f , perché in questo caso è una variabile locale e non un campo:

Le variabili locali sono leggermente diverse; il compilatore non assegna mai un valore predefinito a una variabile locale non inizializzata. Se non è ansible inizializzare la variabile locale in cui è stata dichiarata, assicurarsi di assegnargli un valore prima di tentare di utilizzarlo. L’accesso a una variabile locale non inizializzata comporterà un errore in fase di compilazione.

I campi di class (comunque non final ) vengono inizializzati su valori predefiniti. Le variabili locali non lo sono.

Non è sempre necessario assegnare un valore quando viene dichiarato un campo. I campi dichiarati ma non inizializzati verranno impostati su un valore predefinito predefinito dal compilatore.

Quindi un campo (non final ) come f in

 class C { float f; } 

verrà inizializzato su 0f ma la variabile locale f in

 void myMethod() { float f; } 

non sarà.

Le variabili locali vengono trattate in modo diverso dai campi dalla lingua. Le variabili locali hanno una durata ben definita, quindi qualsiasi utilizzo prima dell’inizializzazione è probabilmente un errore. I campi non sono così spesso l’inizializzazione di default è conveniente.

In realtà le variabili locali sono memorizzate nello stack. Quindi c’è la possibilità di prendere qualsiasi valore vecchio presente per la variabile locale. È una grande sfida per ragioni di sicurezza. Quindi java dice che devi inizializzare una variabile locale prima dell’uso.

Ciao soluzione ragazzi è semplice. i valori che sono memorizzati nella memoria heap sono inizializzati dal tipo di dati basato sul compilatore, ma le variabili locali sono memorizzate nella memoria dello stack, quindi dobbiamo inizializzarlo esplicitamente.