Home > Informatik > Begriffe und Konzepte > NullPointerException

NullPointerException

Allgemeines

Wenn man größere Programme mit vielen Klassen und Objekten schreibt, kommt eine NullPointerException recht häufig vor. Eine solche Exception entsteht immer dann, wenn man über eine Referenz auf ein Objekt zugreifen möchte, diese Referenz aber den Wert null hat. In diesem Fall existiert also kein Objekt, auf das tatsächlich zugegriffen werden könnte.

Die Ursache ist oft, dass ein Objekt nicht erzeugt wurde, eine Referenz-Variable nie einen sinnvollen Wert erhalten hat oder dass ein Array zwar angelegt wurde, seine einzelnen Elemente aber noch nicht mit Objekten gefüllt wurden.

Codebeispiel 1
public class DemoNull
{
    public static void main(String[] args)
    {
        String text = null;
        System.out.println(text.length());
    }
}

Wie jede Variable vom Typ String ist auch text eine Referenz-Variable. Sie kann also auf ein konkretes Objekt im Speicher verweisen. In diesem Beispiel wurde text jedoch ausdrücklich auf null gesetzt. Die Variable verweist daher auf kein einziges Objekt.

Der Aufruf von text.length() führt deshalb zu einem Laufzeitfehler: Es wird eine NullPointerException geworfen.

Bei diesem Beispiel sieht man die Fehlerursache sofort. Als Nächstes schauen wir uns ein Beispiel an, bei dem die Fehlerursache nicht ganz so augenfällig ist.

Codebeispiel 2
public class NullDemo
{
    public static void main(String[] args)
    {
        Person[] personen = new Person[3];

        personen[0] = new Person("Meier");
        personen[1] = new Person("Schulze");

        for (int i = 0; i < personen.length; i++)
        {
            System.out.println(personen[i].getName());
        }
    }
}

Hier wurde ein Array für drei Objekte der Klasse Person angelegt. Dabei ist aber zunächst nur das Array selbst erzeugt worden. Die einzelnen Array-Elemente enthalten anfangs noch den Wert null.

Anschließend werden nur die Elemente personen[0] und personen[1] mit echten Person-Objekten belegt. Das dritte Element personen[2] bleibt dagegen null.

Im letzten Durchgang der for-Schleife wird daher versucht, getName() für personen[2] aufzurufen. Da dort aber gar kein Objekt vorhanden ist, entsteht eine NullPointerException.

Codebeispiel 3
public class Konto
{
    private String inhaber;

    public void ausgabe()
    {
        System.out.println(inhaber.toUpperCase());
    }
}

In diesem Beispiel wurde die Instanzvariable inhaber zwar deklariert, aber nirgends mit einem String-Objekt belegt. Sie hat daher automatisch den Wert null.

Wenn die Methode ausgabe() aufgerufen wird, versucht das Programm, mit toUpperCase() auf ein String-Objekt zuzugreifen. Da inhaber aber null ist, wird eine NullPointerException ausgelöst.

Dieses Beispiel zeigt, dass der Fehler auch bei Instanzvariablen auftreten kann, nicht nur bei lokalen Variablen oder Array-Elementen.

Codebeispiel 4
public class NullRueckgabe
{
    public static String liefereText(boolean ok)
    {
        if (ok)
            return "Hallo";

        return null;
    }

    public static void main(String[] args)
    {
        String s = liefereText(false);
        System.out.println(s.length());
    }
}

Hier liefert die Methode liefereText() nicht in jedem Fall ein echtes String-Objekt zurück. Wenn der Parameter ok den Wert false hat, wird stattdessen null zurückgegeben.

In der main()-Methode wird dieses Ergebnis in der Variablen s gespeichert. Anschließend wird sofort s.length() aufgerufen. Da s in diesem Fall aber null ist, entsteht wieder eine NullPointerException.

Dieses Beispiel ist besonders wichtig, weil solche Fehler in größeren Programmen oft schwer zu finden sind. Die fehlerhafte Stelle liegt dann nämlich nicht unbedingt dort, wo die Exception auftritt, sondern oft schon in einer zuvor aufgerufenen Methode.

In meinem praktischen Informatik-Unterricht in der gymnasialen Oberstufe war diese Art von Exceptions eine der häufigsten Ursachen für Aufregung während der Programmierarbeiten. Und tatsächlich stand ich dann oft minutenlang hinter zwei Schülern, die eine NullPointerException produziert hatten, und konnte selbst den Fehler nicht so schnell finden.

Zusammenfassung (KI-generiert)

Eine NullPointerException entsteht immer dann, wenn eine Referenz-Variable den Wert null hat und trotzdem so verwendet wird, als würde sie auf ein echtes Objekt verweisen. Typische Ursachen sind:

  • eine Variable wurde ausdrücklich auf null gesetzt,

  • ein Array-Element wurde noch nicht mit einem Objekt belegt,

  • eine Instanzvariable wurde nicht initialisiert,

  • eine Methode liefert null zurück, obwohl später mit einem Objekt gerechnet wird.

Gerade in größeren Programmen ist die Ursache oft nicht sofort sichtbar. Deshalb muss man bei einer NullPointerException immer genau prüfen, an welcher Stelle eine Referenz den Wert null bekommen hat.