Vorlesung Informatik 1 - Teil A: Java Kurs

2.8 Die NullPointerException

Java ist eine compilierte Sprache, das hat den Vorteil, dass der Compiler viele Fahler schon entdeckt, bevor unser Programm zum ersten Mal ausgeführt wird.

Es gibt aber eine Reihe von Fehlern, die der Compiler nicht entdeckt und die erst bei der Ausführung auftreten, sogenannte Laufzeitfehler (Runtime Exception).

Zu Beginn einer Programmiererkarriere ist die NullPointerException mit Abstand der häufigste Laufzeitfehler. 

Beispiel:

JPanel p = new JPanel();
JButton b = null;
p.add(b);

Hätten wir geschrieben JButton b; (ohne =null), hätte der Compiler gemeldet "The local variable b may not  have been initialized".  Durch die explizite Initialisierung mit null übernehmen wir die Verantwortung selbst.

Leider sind die Fehler nicht immer so offensichtlich. Die häufigste Ursache für eine NullPointerException sieht so aus:

public abstract class Spiel extends StandardAnwendung implements ActionListener {
protected javax.swing.Timer timer;

protected Spiel(String titel, int breite, int hoehe) {
super(titel, breite,hoehe);
this.setBackground(Color.BLACK);
Timer timer = new Timer(40,this);
this.initialisiere();
timer.start();
}
public final void zeichne(Graphics2D g) {
        if(timer.isRunning())  this.zeichneSpielstand(g);
         }

Die grüne Anweisung führt zur NullPointerException, denn das rot markierte Wort Timer sorgt dafür, dass die lokale Variable timer erzeugt wird, welche die Instanzvariable verdeckt:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at tools.Spiel.zeichne(Spiel.java:31)
at tools.StandardAnwendung.paintComponent(StandardAnwendung.java:84)
at java.desktop/javax.swing.JComponent.paint(Unknown Source)
at tools.StandardAnwendung.paint(StandardAnwendung.java:90)

Wenn Sie in Eclipse auf den blau markierten Text 'Spiel.java:31' klicken, gelangen Sie direkt zur Zeile 31:
  if(timer.isRunning() this.zeichneSpielstand(g);
dort sind timer und g die einzigen Variablen, die null sein können.


Lehrvideo  (YouTube)