La variabile potrebbe non essere stata un errore inizializzato

Quando provo a compilare questo:

public static Rand searchCount (int[] x) { int a ; int b ; ... for (int l= 0; l<x.length; l++) { if (x[l] == 0) a++ ; else if (x[l] == 1) b++ ; } ... } 

Ottengo questi errori:

 Rand.java:72: variable a might not have been initialized a++ ; ^ Rand.java:74: variable b might not have been initialized b++ ; ^ 2 errors 

mi sembra che li abbia inizializzati all’inizio del metodo. Cosa sta andando storto?

Li hai dichiarati , ma non li hai inizializzati. Inizializzandoli li assegni ad un valore:

 int a; // This is a declaration a = 0; // This is an initialization int b = 1; // This is a declaration and initialization 

Si ottiene l’errore perché non sono state inizializzate le variabili, ma le si incrementa (ad esempio, a++ ) nel ciclo for .

Le variabili locali non ricevono valori predefiniti. I loro valori iniziali sono indefiniti con l’assegnazione di valori in qualche modo. Prima di poter usare le variabili locali devono essere inizializzate.

C’è una grande differenza quando si dichiara una variabile a livello di class (come membro, come campo) e a livello di metodo.

Se dichiari un campo a livello di class ottengono valori predefiniti in base al loro tipo. Se dichiari una variabile a livello di metodo o come blocco (significa anycode all’interno di {}) non ottieni alcun valore e rimane indefinito fino a quando in qualche modo ottengono alcuni valori iniziali, ad esempio alcuni valori assegnati a loro.

Se fossero dichiarati come campi della class, sarebbero stati inizializzati realmente con 0.

Sei un po ‘confuso perché se scrivi:

 class Clazz { int a; int b; Clazz () { super (); b = 0; } public void printA () { sout (a + b); } public static void main (String[] args) { new Clazz ().printA (); } } 

Quindi questo codice stamperà “0”. È perché verrà chiamato un costruttore speciale quando crei una nuova istanza di Clazz. All’inizio verrà chiamato super () , quindi il campo a sarà inizializzato in modo implicito, quindi verrà eseguita la riga b = 0 .

Li hai dichiarati, ma non inizializzati.

 int a; // declaration, unknown value a = 0; // initialization int a = 0; // declaration with initialization 

Li hai dichiarati, ma non li hai inizializzati con un valore. Aggiungi qualcosa come questo:

 int a = 0; 

Non hai inizializzato b , solo li hai dichiarati. C’è una sottile differenza.

 int a = 0; int b = 0; 

Almeno questo è per C ++, presumo che Java sia lo stesso concetto.

Li hai dichiarati all’inizio del metodo, ma non li hai mai inizializzati. L’inizializzazione sarebbe impostandoli uguali a un valore, come ad esempio:

 int a = 0; int b = 0; 

Li hai dichiarati ma non hai fornito loro un valore iniziale, quindi non sono stati personalizzati. Prova qualcosa come:

 public static Rand searchCount (int[] x) { int a = 0 ; int b = 0 ; 

e gli avvertimenti dovrebbero andare via.

Immagina cosa succede se x [l] non è né 0 né 1 nel ciclo. In tal caso, a e b non saranno mai assegnati e avranno un valore indefinito. È necessario inizializzarli entrambi con un valore, ad esempio 0.

Imposta la variabile “a” su un valore come questo,

 a=0; 

La dichiarazione e l’inizializzazione sono entrambe differenti.

In bocca al lupo

 int a = 0; int b = 0; 

È una buona pratica inizializzare le variabili locali all’interno del blocco del metodo prima di usarlo. Ecco un errore che un principiante può commettere.

  public static void main(String[] args){ int a; int[] arr = {1,2,3,4,5}; for(int i=0; i 

È probabile che la console mostrerà "5", ma il compilatore genererà un errore "la variabile a potrebbe non essere inizializzata". Sebbene si possa pensare che la variabile a sia 'inizializzata' all'interno del ciclo for, il compilatore non pensa in questo modo. Cosa succede se arr.length è 0? Il ciclo for non verrà eseguito affatto. Quindi, il compilatore fornirà variable a might not have been initialized per indicare il potenziale pericolo e richiedere l'inizializzazione della variabile.

Per evitare questo tipo di errore, è sufficiente inizializzare la variabile al momento della sua dichiarazione.

 int a = 0;