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:
—
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
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…