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.