table Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException

philBerlin

Mitglied
Hallo hallo,

mich beschäftigt seit einiger Zeit ein Problem und ich würde hier nicht schreiben, wenn ich nicht wirklich gründlich recherchiert hätte. Ich bekomme folgende Fehlermeldung, wenn ich Daten in eine jTable einfüge:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0 >= 0
at java.util.Vector.elementAt(Vector.java:427)
at javax.swing.table.DefaultTableColumnModel.getColumn(DefaultTableColumnModel.java:277)
at javax.swing.plaf.basic.BasicTableHeaderUI.getHeaderHeight(BasicTableHeaderUI.java:688)
at javax.swing.plaf.basic.BasicTableHeaderUI.createHeaderSize(BasicTableHeaderUI.java:721)
at javax.swing.plaf.basic.BasicTableHeaderUI.getPreferredSize(BasicTableHeaderUI.java:752)
at javax.swing.JComponent.getPreferredSize(JComponent.java:1627)
at javax.swing.ViewportLayout.layoutContainer(ViewportLayout.java:123)
at java.awt.Container.layout(Container.java:1432)
at java.awt.Container.doLayout(Container.java:1421)
at java.awt.Container.validateTree(Container.java:1519)
at java.awt.Container.validateTree(Container.java:1526)
at java.awt.Container.validate(Container.java:1491)
at javax.swing.RepaintManager.validateInvalidComponents(RepaintManager.java:639)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:127)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)


Das ArrayIndexOutOfBoundsException: 0 >= 0 nimmt verschieden Werte an, wei z.B. 1 >= 1, 2 >= 1, 2 >= 2 usw.

folgenden Code benutze ich um die Daten einzufügen:
Code:
public void addOwnStudies(LinkedList<Study> studyList) {

        this.studyList = studyList;
        
        String columns[] = {"", Message.STUDY(desk.LANG), Message.AUTHOR(desk.LANG), Message.DATE(desk.LANG)};        
        Object rows[][] = new Object[studyList.size()][columns.length];

        if (studyList.size() > 0) {
            int i = 0;
            for(Study s : studyList) {
                rows[i][0] = studyList.indexOf(s);
                rows[i][1] = s.getStudyName();
                rows[i][2] = s.getAuthor();
                rows[i][3] = s.getStudyDate();
                i++;
            }

           TableModel model = new DefaultTableModel(rows, columns) {
                
                public Class getColumnClass(int column) {
                    Class returnValue;
                    if ((column >= 0) && (column < getColumnCount())) {
                        returnValue = getValueAt(0, column).getClass();
                    } else {
                        returnValue = Object.class;
                    }
                    return returnValue;
                }
                
                public boolean isCellEditable(int row, int col) {
                    return false;
                }
                
            };
            
            RowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
            table.setModel(model);
            table.setRowSorter(sorter);          

        } else {
            String empty[][] = {};
            TableModel model = new DefaultTableModel(empty, columns);
            table.setModel(model);
            table.setRowSorter(null);
        }
        
        initColumnSizes(table);    

    }

Das ganze läuft unter java 6. Ich habe schon verschiedene Sachen ausprobiert, wie z.B. das DefaultTableModel in eine eigene Klasse auszulagern oder den TableRowSorter wegzulassen.

Ich bin bei meiner Recherche auf folgenden Bugreport gestoßen, der dieser Exception hier relativ ähnlich ist, allerdings ist dieser als "Closed" markiert:

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6462008

Ich finde das Schwierige dabei den Fehler zu finden ist, dass beim StackTrace vom EventDispatchThread bis zur Exception keine einzige Zeile von meinem Code vorkommt. Wenn mir irgendjemand helfen kann, würde ich mich freuen :)

grüße phil
 
Hallo hallo,

ich hab zu diesem Problem noch ein paar Sachen herausgefunden...

Die Exception wird genau dann ausgelöst, wenn das TableModel der Tabelle übergeben wird, also genau in dieser Zeile:

Code:
table.setModel(model);

Die Exception wird immer genau dann ausgelöst, wenn Daten direkt aus der Datenbank kommen, und wenn die Anzahl der Zeilen kleiner ist als die Anzahl der vorhandenen Zeilen. Aus diesem Grund tritt die Exception auch nie beim ersten Start auf, sondern immer erst wenn man sich neue Daten zieht.

Die Exception tritt aber nicht auf, wenn die vorhandenen Daten durch einen Filter laufen und angezeigt werden. Also kann es wiederum nichts damit zu tun haben, dass die Anzahl der Zeilen kleiner ist... Paradox? Irgendwie schon... :confused:

Die Exception tritt weiterhin auch nicht auf, wenn man radikal die ganze Tabelle komplett neu baut...

Ich wäre schon dankbar, wenn jemand eine Ahnung äußern würde. :)

grüße phil
 
Hallo hallo,

ich hab das jetzt so gemacht, dass die Table komplett neu erzeugt wird. Das klappt ganz gut und die Exception tritt nicht mehr auf.

Da ich sonst alles so gelassen habe, vermute ich stark, dass es echt nichts mit meinem Code zu tun hat.

Könnte es sein, dass es sich dabei um einen Java-Bug handelt?

grüße phil
 
Hallo Phil,
ich habe genau das gleiche Problem wie Du und kämpfe damit schon seit einer Woche. Ich vewende für die Datenbankabfrage ein SwingWorker-Thread, um das ResultSet-Objekt zu bekommen. Dann folgt gleich im diesem Thread der Aufruf "tabellenModell.setResultSet(rs);". Und das ist eben das Problem. Der Aufbau der Tabelle (z.B. prepareRenderer-Aufruf) passiert im Event Dispatching Thread. Ich verwende genauso wie Du ein TableRowSorter-Objekt, und deshabl ist es notwendig, den View-Index in ein Model-Index zu übersetzen. Dadurch das die zwei in zwei verschiedene Threads laufen, entsteht da eine Diskrepanz.
Ich habe dann das Tabellenmodell im Event Dispatching Thread aktualisiert, der Fehler ist überhaupt nicht mehr aufgetreten, allerdings habe ich mein Fortschrittsbalken (progressBar.setIndeterminate(true)) eingefroren, denn der EDT wartet und damit blockiert die GUI, bis das Ergebnis der Abfrage aus dem SwingWorker-Thread zurückgegeben wird.
Leider habe ich immer noch nicht rausgefunden, wie ich den Fehler loswerde, ohne dabei den Fortschrittsbalken unbrauchbar zu machen.
Vielleicht konnte ich Dir ein paar brauchbare Informationen weitergeben. Falls Du inzwischen eine Lösung gefunden hast, wäre es schön, zu erfahren wie.

Schönen Gruß,
Costin
 
Hallo Leute,

vor einiger Zeit hat mir ein User die Antwort zu diesem Problem gegeben. Ich habe ihm vorgeschlagen die Antwort unbedingt in diesen Thread zu schreiben. Leider hat er es nicht gemacht. Da ich euch die Antwort nicht vorenthalten möchte, werde ich sie jetzt hier posten in der Hoffnung, dass das kein Problem ist:
Hallo,

ich habe neulich deinen Beitrag( table Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException vom 13.04.07) gelesen. Da ich dasgleiche Problem vor einiger Zeit hatte, das ich damals nicht gelöst habe, hat mich diesmal Ergeiz gepackt, das nochmal zu versuchen. Was ich bis jetzt herausgefunden habe, es handelt sich tatsäclich um einen Java-Bug. Es gibt allerdings einen Trick, wie man das umgehen kann. Und zwar, den Code, den du ausführen willst, packst du einfach in einen

SwingUtilities.invokeLater(new Runnable() {
public void run() {
//dein Code...
}
}
ein. Nachdem ich das bei mir gemacht habe, bekomme ich keine Exception mehr.

Vielen Dank digga, denke es wird einigen helfen...
Phil
 
Servus,

habe heute ein wenig rumgespielt und der Fehler trat immer auf, wenn die länge der Columns größer war, als die Tupel mit den Datensätzen!

kA, ob das immer so ist. Aber vielleicht hilfts ja einigen...Habe die Query dann verändert und alles hat gepasst.

Mfg
 
Zurück