Eigentlich wollte ich heute den neusten Build unserer Software releasen. Mit dem vorigen hatte es nämlich ein Problem gegeben: Bei unserer Mitarbeiterin waren Fehlerreports aufgelaufen, dass sich eine Maske nicht öffnen ließ. Prüfung meinerseits: Die Java-Laufzeitumgebung meldet einen „VerifyError”. Hm. Muss wohl was beim Packen schiefgegangen sein.
Also heute morgen den Packprozess genau beobachtet: Alles roger. Trotzdem das Binary nochmal getestet: Bautz! Fehler immer noch da.
Und dann habe ich wirklich den gesamten Tag damit zugebracht, das Problem zu analysieren und letztlich zu lösen: Der Compiler von Java 1.4.2, selbst in der aktuellen 1.4.2_12-Version, macht einen Fehler, wenn man aus der inneren Klasse einer inneren Klasse heraus eine Methode der äußersten Klasse aufruft. Mein Codebeispiel:
—
public class CompilerProblemDemo extends JPanel {
public CompilerProblemDemo() {
super(new BorderLayout());
add("Center",new InnerPanel());
}
private class InnerPanel extends JPanel {
private JButton testbutton;
public InnerPanel() {
super(new BorderLayout());
testbutton=new JButton("Test");
testbutton.addFocusListener(new FocusAdapter() {
public void focusGained(FocusEvent e) {
// This line leads to VerifyError if compiled with Sun javac 1.4.2_12.
// Works correctly if compiled with Eclipse 3.2.0 in 1.4 mode
// Runtime envorinment in both cases: Sun java 1.5.0_07
CompilerProblemDemo.this.firePropertyChange("gotFocus",null,null);
}
});
add("Center",testbutton);
}
}
public static void main(String[] args) {
CompilerProblemDemo cpd=new CompilerProblemDemo();
cpd.addPropertyChangeListener("gotFocus",new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
System.out.println("I received the focus event");
}
});
JFrame jf=new JFrame("CompilerProblemDemo");
((JPanel)jf.getContentPane()).add("Center",cpd);
jf.pack();
jf.show();
}
}
—
Fieserweise tritt der Bug im Eclipse-eigenen Compiler nicht auf. Nachdem das Problem lokalisiert hatte, habe ich den Fehler auch in der Bug-Datenbank bei Sun gefunden. Dort steht, dass er mit Java 1.5 gefixt ist.
Werde ich wohl doch mal den Compiler fürs Produktivsystem umstellen. Zunächst noch im 1.4-Kompatibilitätsmodus, aber der endgültige Schwenk zu Java 1.5 ist auch nicht mehr so lange weg…
Dass es sowas gibt… Ich verwende ja nun den Sun-Compiler extra wegen der Kompatibilität und so. Früher, als ich noch mit jikes die Releases kompiliert habe, da kam sowas ja häufiger vor. Tststs…

