it-swarm.com.de

Die Variable wurde möglicherweise nicht initialisiert

Wenn ich versuche, das zu kompilieren: 

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 bekomme diese Fehler: 

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

es scheint mir, dass ich sie an der Spitze der Methode initialisiert habe. Was läuft schief? 

46
David

Sie haben sie erklärt, aber Sie haben sie nicht initialisiert. Beim Initialisieren werden sie auf einen Wert gesetzt:

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

Sie erhalten den Fehler, weil Sie die Variablen nicht initialisiert haben, aber inkrementieren (z. B. a++) in der for-Schleife.

Java-Grundelemente haben Standardwerte, werden jedoch von einem Benutzer kommentiert

Ihr Standardwert ist Null, wenn sie als Klassenmitglieder deklariert wird. Lokale Variablen haben keine Standardwerte

71
mipadi

Lokale Variablen erhalten keine Standardwerte. Ihre Anfangswerte sind undefiniert, ohne dass Werte 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 Member, dh als Feld) und auf Methodenebene deklarieren.

Wenn Sie ein Feld auf Klassenebene deklarieren, erhalten sie entsprechend ihrem Typ Standardwerte. Wenn Sie eine Variable auf Methodenebene oder als Block deklarieren (bedeutet anycode in {}), erhalten Sie keine Werte und bleiben undefiniert, bis sie irgendwie Startwerte erhalten, dh einige Werte, die ihnen zugewiesen werden.

69
reddy

Wenn sie als Felder der Klasse deklariert wurden, würden sie wirklich mit 0 initialisiert.

Sie sind etwas verwirrt, denn 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 die Zeile b = 0 ausgeführt.

6
Roman

Sie haben sie deklariert, aber nicht initialisiert.

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

Sie haben sie deklariert, aber nicht mit einem Wert initialisiert. So etwas hinzufügen:

int a = 0;
2
Jerome

Sie haben a und b nicht initialisiert, sondern nur deklariert. Es gibt einen subtilen Unterschied.

int a = 0;
int b = 0;

Zumindest ist dies für C++, ich gehe davon aus, dass Java dasselbe Konzept ist.

1
Andy Shellam

Sie haben sie zu Beginn der Methode deklariert, aber nie initialisiert. Die Initialisierung würde sie auf einen Wert setzen, wie zum Beispiel:

int a = 0;
int b = 0;
1
Thomas Owens

Setzen Sie die Variable "a" auf einen solchen Wert,

a=0;

Deklarieren und Initialisieren sind beide unterschiedlich. 

Viel Glück

1
Rishabh Agarwal

Sie haben sie zwar deklariert, aber nicht mit einem Anfangswert versehen - daher sind sie nicht initialisiert. Versuchen Sie etwas wie:

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

und die Warnungen sollten verschwinden.

1
Bob Jarvis

Stellen Sie sich vor, was passiert, wenn x [l] weder 0 noch 1 in der Schleife 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.

1
codymanix

Es empfiehlt sich, die lokalen Variablen im Methodenblock vor der Verwendung zu initialisieren. Hier ist ein Fehler, den ein Anfänger begehen kann.

  public static void main(String[] args){
    int a;
    int[] arr = {1,2,3,4,5};
    for(int i=0; i<arr.length; i++){
        a = arr[i];
    }
    System.out.println(a);
  }

Sie können davon ausgehen, dass die Konsole '5' anzeigt, der Compiler jedoch stattdessen 'Variable' wirft und der Fehler möglicherweise nicht initialisiert wird. Obwohl man denken kann, dass die Variable a innerhalb der for-Schleife 'initialisiert' wird, denkt der Compiler nicht so. Was ist, wenn arr.length 0 ist? Die for-Schleife wird überhaupt nicht ausgeführt. Daher gibt der Compiler variable a might not have been initialized an, um auf die potenzielle Gefahr hinzuweisen und Sie müssen die Variable initialisieren.

Um diese Art von Fehler zu vermeiden, initialisieren Sie die Variable einfach, wenn Sie sie deklarieren.

int a = 0;
0
jackycflau