05.04 Variable might not have been initialized

Wenn auf eine lokale Variable zugegriffen wird, ohne dass sie vorher initialisiert wurde, meldet der Compiler variable might not have been initialized. Dies tritt aber nicht auf, wenn Attribute nicht initialisiert wurden, da diese Ihren Standardwert zugewiesen bekommen (siehe Kapitel 02.03 Primitive Datentypen und Kapitel 04.02 Objekte).

Versuchen Sie nachfolgende Klasse zu kompilieren:

package de.jbb.syntaxerrors;

public class NotInit {

  public static void main(String[] args) {

    int i;
    String s;
    boolean b = false;
    if (b == true) {
      i = 2;
    }
    System.out.println(i);
    System.out.println(s);
    System.out.println(b);
  }
}

Sie erhalten folgende Fehlermeldung:

NotInit.java:11: variable i might not have been initialized
    System.out.println(i);
                       ^
NotInit.java:12: variable s might not have been initialized
    System.out.println(s);
                       ^
2 errors

Wie Sie sehen, wird nur beim Zugriff auf die Variablen i und s der Fehler verursacht. Dies liegt daran, dass diese Variablen nur deklariert, nicht aber initialisiert wurden (int i; anstelle von int i = 0;), und es sich gleichzeitig um lokale Variablen handelt.

Häufige Fehlerursache

Zur Behebung des Fehlers ist es wichtig zu wissen, dass der Fehler auch geworfen wird, wenn eine Variable nicht initialisiert sein könnte. Er wird also auch verursacht, wenn eine Variable nur unter Umständen nicht initialisiert ist. Lassen Sie uns das an einem Beispiel verdeutlichen.

Angenommen Sie wissen, dass die Variable zahl immer einen Wert zwischen 0 und 2 hat. Je nach Wert dieser Variablen möchten Sie der Variablen ergebnis einen anderen Wert zuweisen.

int zahl = 1;
int ergebnis;
if (zahl == 0) {
  ergebnis = 32;
}
else if (zahl == 1) {
  ergebnis = 4;
}
else if (zahl == 2) {
  ergebnis = 10;
}
System.out.println(ergebnis);

Selbstverständlich lässt sich dieser Code auch nicht kompilieren, da Sie zwar wissen (oder zumindest davon ausgehen), dass zahl keinen anderen Wert als 0, 1 oder 2 haben kann, aber der Compiler von Ihrer Programmlogik keine Ahnung hat. Außerdem könnte zahl trotzdem einen anderen Wert als 0-2 annehmen. Selbiges gilt übrigens auch für else-if-Konstrukte mit booleans:

boolean b = true;
int ergebnis;
if (true == b) {
  ergebnis = 0;
}
else if (false == b) {
  ergebnis = 1;
}
System.out.println(ergebnis);

Auch dieser Code lässt sich nicht kompilieren.

Häufig liegt der Fehler auch darin, dass eine Variable in der kompletten Methode benötigt, aber erst in einem try-catch-Block initialisiert wird. Greifen Sie dann im catch- oder finally-Block, oder nach dem try-catch-Block auf diese Variable zu, könnte es ebenfalls sein, dass diese Variable noch nicht initialisiert wurde => es kommt zu unserem Compiler-Fehler.

int i;
try {
  i = 0;
}
catch (Exception e) {
  System.out.println(i);
}

oder

int i;
try {
  i = 0;
}
catch (Exception e) {}
finally {
  System.out.println(i);
}

oder

int i;
try {
  i = 0;
}
catch (Exception e) {}
System.out.println(i);

Fehlerbehebung

Die einfachste Möglichkeit diesen Fehler zu lösen ist natürlich alle lokalen Variablen vor dem ersten Zugriff mit einem Standardwert zu initialisieren.

Wird auf die lokale Variable nie zugegriffen, muss sie auch nicht initialisiert werden. Eine lokale Variable, auf die nie zugegriffen wird, macht aber auch nicht gerade viel Sinn.

Wenn Sie eine Variable allerdings erst in einem try-Block initialisieren, die Variable aber nach der Ausführung des try-catch-Blocks noch weiter verwenden möchten, denken Sie daran (um den Fehler zu vermeiden) die Variable auch im catch-Block zu initialisieren.

int i;
try {
  i = 0;
}
catch (Exception e) {
  i = 1;
}
System.out.println(i);

Bei der Initialisierung der Variablen über if-Anweisungen müssen Sie beachten, dass die if-Anweisungen über else-if-Statements miteinander verkettet, und mit einem else-Block abgeschlossen werden. So kann der Compiler sicher sein, dass in jedem Fall die Variable initialisiert wurde.

int ergebnis;
int zahl = 2;
if (zahl == 0) {
  ergebnis = 32;
}
else if (zahl == 1) {
  ergebnis = 4;
}
else {
  ergebnis = 10;
}
System.out.println(ergebnis);

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.