JVxTable ArrayIndexOutOfBoundsException
Posted: Mon Jun 02, 2014 5:54 pm
Hallo!
Ich bin mit meinem Latein am Ende. Das Ticketsystem zu unserem Problem hätte ich bereits durchsucht, jedoch nichts passendes gefunden. Auch bin ich mir nicht sicher, ob es sich überhaupt um einen JVx Bug handelt.
Also versuche ich mein Glück mal hier, vielleicht ergibt sich ja was.
Das Setting:
Ein Teil unsere neuen Applikation stellt ein Software-Terminal dar. Dieses läuft – überwacht von einem anderen Programm – durchgängig.
Prinzipiell ist die Applikation nach wie vor Forms, nur die Hauptmaske wurde durch einen WorkScreen ersetzt.
Auf diesem befindet sich physisch nur eine Tabelle, wenn auch unsichtbar (für Debugzwecke bzw. Expertenmodus).
Diese Tabelle wird durch ein MemDataBook gespeist. Die Rowdefinition setzt sich aus genau 4 Spalten zusammen. In den meisten Fällen befinden sich nicht einmal Daten darin.
Die Applikation läuft einem Windows 7 Rechner mit Java 1.7.0_55.
Initialisierung:
Danach wird auf dem Databook nur mehr ab und zu ein Datensatz hinzugefügt.
Das Problem:
Nach einigen Tagen wirft die Applikation jedoch einen Fehler:
Das Problem wird also ausgelöst durch eine Forms-Message auf ein Textfield. Diese validiert den gesamten Komponenten-Baum durch und löst auf der JTable ein Layouting aus.
Inspektion:
Eine Heapdump-Analyse vor und nach dem Fehler bringt keinen Erfolg, metadata, columnModel als auch die columnView sprechen von jeweils 4 Spalten.
Das einzige, das ich mir erklären könnte ist die Tatsache, dass das Ganze nicht auf dem AWTEventThread läuft, und sich deshalb mit diesem spießen könnte, dementsprechend also eine "Race"-Condition.
Was mich daran stört ist jedoch folgendes:
In der Methode setWidthsFromPreferredWidths der JTable wird bereits die Anzahl an Spalten abgeholt über die eine Methode später in adjustSizes drübergeloopt wird.
Es müsste sich also genau in der Zwischenzeit das TableColumnModel ändern.
Leider sind Untersuchungen in dieser Gegend ziemlich mühselig, da das Problem nur alle paar Tage bei durchgehendem Lauf auftritt.
Ich wüsste nicht wie ich dem vorbeugen könnte.
Ich bin mit meinem Latein am Ende. Das Ticketsystem zu unserem Problem hätte ich bereits durchsucht, jedoch nichts passendes gefunden. Auch bin ich mir nicht sicher, ob es sich überhaupt um einen JVx Bug handelt.
Also versuche ich mein Glück mal hier, vielleicht ergibt sich ja was.
Das Setting:
Ein Teil unsere neuen Applikation stellt ein Software-Terminal dar. Dieses läuft – überwacht von einem anderen Programm – durchgängig.
Prinzipiell ist die Applikation nach wie vor Forms, nur die Hauptmaske wurde durch einen WorkScreen ersetzt.
Auf diesem befindet sich physisch nur eine Tabelle, wenn auch unsichtbar (für Debugzwecke bzw. Expertenmodus).
Diese Tabelle wird durch ein MemDataBook gespeist. Die Rowdefinition setzt sich aus genau 4 Spalten zusammen. In den meisten Fällen befinden sich nicht einmal Daten darin.
Die Applikation läuft einem Windows 7 Rechner mit Java 1.7.0_55.
Initialisierung:
- Code: Select all
private void initializeModel() throws Exception {
RowDefinition rd = new RowDefinition();
rd.addColumnDefinition(new ColumnDefinition("PIN"));
rd.addColumnDefinition(new ColumnDefinition("WERT"));
rd.addColumnDefinition(new ColumnDefinition("APNR"));
rd.addColumnDefinition(new ColumnDefinition("APSPLITTNR"));
mdbMDEDaten = new MemDataBook(rd);
mdbMDEDaten.setName("MDE-DataBook");
mdbMDEDaten.open();
}
protected void initializeUI() throws Exception {
this.setLayout(new UIBorderLayout());
UITable table = new UITable();
table.setEditable(false);
table.setDataBook(mdbMDEDaten);
this.add(table, UIBorderLayout.CENTER);
}
Danach wird auf dem Databook nur mehr ab und zu ein Datensatz hinzugefügt.
Das Problem:
Nach einigen Tagen wirft die Applikation jedoch einen Fehler:
- Code: Select all
java.lang.ArrayIndexOutOfBoundsException: 3 >= 3
at java.util.Vector.elementAt(Unknown Source)
at javax.swing.table.DefaultTableColumnModel.getColumn(Unknown Source)
at com.sibvisions.rad.ui.swing.ext.JVxTable$DataBookTableColumnModel.getColumn(JVxTable.java:2258)
at javax.swing.JTable$2.getMidPointAt(Unknown Source)
at javax.swing.JTable.adjustSizes(Unknown Source)
at javax.swing.JTable.setWidthsFromPreferredWidths(Unknown Source)
at javax.swing.JTable.doLayout(Unknown Source)
at com.sibvisions.rad.ui.swing.ext.JVxTable$1.doLayout(JVxTable.java:222)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validate(Unknown Source)
at oracle.forms.handler.ComponentItem.doAutoScroll(Unknown Source)
at oracle.forms.handler.ComponentItem.onUpdate(Unknown Source)
at oracle.forms.handler.TextComponentItem.onUpdate(Unknown Source)
at oracle.forms.handler.TextFieldItem.onUpdate(Unknown Source)
at oracle.forms.handler.UICommon.onUpdate(Unknown Source)
at oracle.forms.engine.Runform.onUpdateHandler(Unknown Source)
at oracle.forms.engine.Runform.processMessage(Unknown Source)
at oracle.forms.engine.Runform.processSet(Unknown Source)
at oracle.forms.engine.Runform.onMessageReal(Unknown Source)
at oracle.forms.engine.Runform.sendDeferredMessages(Unknown Source)
at oracle.forms.engine.Runform.onMessage(Unknown Source)
at oracle.forms.engine.Heartbeat.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Das Problem wird also ausgelöst durch eine Forms-Message auf ein Textfield. Diese validiert den gesamten Komponenten-Baum durch und löst auf der JTable ein Layouting aus.
Inspektion:
Eine Heapdump-Analyse vor und nach dem Fehler bringt keinen Erfolg, metadata, columnModel als auch die columnView sprechen von jeweils 4 Spalten.
Das einzige, das ich mir erklären könnte ist die Tatsache, dass das Ganze nicht auf dem AWTEventThread läuft, und sich deshalb mit diesem spießen könnte, dementsprechend also eine "Race"-Condition.
Was mich daran stört ist jedoch folgendes:
In der Methode setWidthsFromPreferredWidths der JTable wird bereits die Anzahl an Spalten abgeholt über die eine Methode später in adjustSizes drübergeloopt wird.
Es müsste sich also genau in der Zwischenzeit das TableColumnModel ändern.
Leider sind Untersuchungen in dieser Gegend ziemlich mühselig, da das Problem nur alle paar Tage bei durchgehendem Lauf auftritt.
Ich wüsste nicht wie ich dem vorbeugen könnte.