2010-03-15 22 views
30

Wenn ich versuche, dies zu kompilieren:Variable wurde möglicherweise nicht initialisiert Fehler

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

    ... 

} 

ich diese Fehler erhalten:

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

scheint es mir, dass ich sie an der Spitze des Verfahrens initialisiert . Was läuft falsch?

Antwort

53

Sie deklariert sie, aber Sie haben sie nicht initialisiert. sie Initialisierung setzt sie auf einen Wert gleich:

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

Sie den Fehler erhalten, weil Sie die Variablen nicht initialisiert haben, aber Sie erhöhen sie (zum Beispiel a++) in der for Schleife.

+19

Vielleicht "int b = 0;" ist "Deklaration und Initialisierung". – Arun

+0

Für zukünftige Besucher ... Siehe auch [Standardwerte und Initialisierung in Java] (http://Stackoverflow.com/q/19131336), wenn die potenziell nicht initialisierte Variable ein Klassenmitglied ist. – jww

+0

Kann jemand erklären, wie das möglich ist, weil Grundelemente keine Nullwerte haben können, ihr Standardwert ist 0, warum zeigt es nicht initialisierten Fehler? –

0
int a = 0; 
int b = 0; 
2

Sie haben sie deklariert, aber sie nicht mit einem Wert initialisiert. In etwa so:

1

Sie nicht a und b initialisiert haben, nur um sie erklärt. Es gibt einen feinen Unterschied.

int a = 0; 
int b = 0; 

Zumindest ist dies für C++, ich vermute Java ist das gleiche Konzept.

+0

ja Java ist die gleiche (ich glaube) – David

1

Sie haben sie am Anfang der Methode deklariert, aber Sie haben sie nie initialisiert. Initialisierung würde sie gleich einem Wert, wie zum Beispiel:

int a = 0; 
int b = 0; 
6

Wenn sie als Felder der Klasse deklariert wurden dann würden sie wirklich mit 0

Sie sind da ein bisschen verwirrt initialisiert werden, wenn Sie schreiben:

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(); 
    } 
} 

Dann wird dieser Code "0" drucken. Dies liegt daran, dass beim Erstellen einer neuen Instanz von Clazz ein spezieller Konstruktor aufgerufen wird. Zuerst wird super() aufgerufen, dann wird das Feld a implizit initialisiert, und dann wird die Zeile b = 0 ausgeführt.

3

Sie haben sie deklariert, aber nicht initialisiert.

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

Sie haben sie deklariert, haben ihnen aber keinen Anfangswert gegeben - sie sind also nicht identifiziert. Versuchen Sie etwas wie:

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

und die Warnungen sollten weggehen.

1

Stellen Sie sich vor, was passiert, wenn x [l] in der Schleife weder 0 noch 1 ist. In diesem Fall werden a und b niemals zugewiesen und haben einen undefinierten Wert. Sie müssen beide mit einem Wert initialisieren, z. B. 0.

55

Lokale Variablen erhalten keine Standardwerte. Ihre Anfangswerte sind undefiniert, ohne dass Werte auf irgendeine Weise zugewiesen werden. Bevor Sie lokale Variablen verwenden können, müssen sie initialisiert werden.

Es gibt einen großen Unterschied, wenn Sie eine Variable auf Klassenebene (als Mitglied, dh als ein Feld) und auf Methodenebene deklarieren.

Wenn Sie ein Feld auf Klassenebene deklarieren, erhalten sie Standardwerte entsprechend ihrem Typ. Wenn Sie eine Variable auf Methodenebene oder als Block deklarieren (also einen Code innerhalb von {}), erhalten Sie keine Werte und bleiben undefiniert, bis sie einige Startwerte erhalten, dh ihnen Werte zugewiesen werden.

1

Set Variable "a" bis zu einem gewissen Wert wie dieser,

a=0; 

Deklarieren und initialzing sind beide unterschiedlich.

Good Luck

+0

Nicht wirklich. Die Initialisierung ist ein optionaler Teil der Deklarationssyntax. – EJP

Verwandte Themen