Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Непонятный ArrayIndexOutOfBoundsException


Автор: STIM 30.3.2012, 21:26
Возникла следующая проблема. Есть таблица, с мною созданной моделью наследованной от AbstractTableModel. Проблема в том, что, при многократном редактировании строк таблицы вылезает исключение. При этом оно вылезает не всегда (но чаще, чем не вылезает), и непонятно на что указывает:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0 >= 0
    at java.util.Vector.elementAt(Unknown Source)
    at javax.swing.table.DefaultTableColumnModel.getColumn(Unknown Source)
    at javax.swing.JComponent.getPreferredSize(Unknown Source)
    at javax.swing.ViewportLayout.layoutContainer(Unknown Source)
    at java.awt.Container.layout(Unknown Source)
    at java.awt.Container.doLayout(Unknown Source)
    at java.awt.Container.validateTree(Unknown Source)
    at java.awt.Container.validateTree(Unknown Source)
    at java.awt.Container.validate(Unknown Source)
    at javax.swing.RepaintManager.validateInvalidComponents(Unknown Source)
    at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$000(Unknown Source)
    at java.awt.EventQueue$1.run(Unknown Source)
    at java.awt.EventQueue$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

Код большой, выкладывать смысла нет, не зная в каком месте исключение происходит. Подбросьте, пожалуйста, идею в каком месте искать ошибку и как ловить ошибку.

Автор: dorogoyIV 30.3.2012, 22:46
Цитата(STIM @  30.3.2012,  21:26 Найти цитируемый пост)
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0 >= 0    at java.util.Vector.elementAt(Unknown Source)

пытаешься получить элемент когда в векторе еще нет элементов

Автор: COVD 31.3.2012, 00:07
наверное "при многократном редактировании строк"  вы каким-то образом удаляете колонки из ColumnModel и таблица об этом не знает  

Автор: STIM 31.3.2012, 07:38
Код модели таблицы:
Код


public class BetTableModel extends AbstractTableModel {
    // Сделаем хранилище для нашего списка ставок
    private Vector bets;
    // Модель при создании получает список ставок
    public BetTableModel(Vector bets) {
        this.bets = bets;
    }

    // Количество строк равно числу записей
    public int getRowCount() {
        if (bets != null) {
            return bets.size();
        }
        return 0;
    }
    
    // Количество столбцов - 9
    public int getColumnCount() {
        return 9; 
    }
    
    // Вернем наименование колонки
    public String getColumnName(int column) {
        String[] colNames = {"Номер ставки", "Время ставки", "Id чемпионата", "Первая команда", "Вторая команда","Коэф.1","Ничья","Коэф.2","Результат"};
        return colNames[column];
    }
    
    // Возвращаем данные для определенной строки и столбца
    public Object getValueAt(int rowIndex, int columnIndex) {
        if (bets != null) {
            // Получаем из вектора ставку
            Bets bt = (Bets) bets.get(rowIndex);
            // В зависимости от колонки возвращаем 
            switch (columnIndex) {
                case 0: 
                    return bt.getBetId();
                case 1:
                    return bt.getBetTime();
                case 2: 
                    return bt.getChampId();
                case 3:
                    return bt.getNameCom1();
                case 4:
                    return bt.getNameCom2();
                case 5:
                    return bt.getWin1Coef();
                case 6:
                    return bt.getDrawCoef();
                case 7:
                    return bt.getWin2Coef();
                case 8:
                    return bt.getResult();
            }
        }
        return null;
    }
    
    // Добавим метод, который возвращает ставки по номеру строки

    public Bets getStudent(int rowIndex) {
        if (bets != null) {
            if (rowIndex < bets.size() && rowIndex >= 0) {
                return (Bets) bets.get(rowIndex);
            }
        }
        return null;
    }

}




Автор: COVD 31.3.2012, 15:06
Здесь все правильно

Автор: dorogoyIV 31.3.2012, 15:19
Цитата(COVD @  31.3.2012,  15:06 Найти цитируемый пост)
Здесь все правильно

я бы добавил метод setValueAt(Object value, int row, int column) ...
тогда изменения сохранялись бы в модели, а щас у ТС неизвестно куда изменения в таблице попадают  smile 

Автор: COVD 31.3.2012, 16:36
getColumnCount() всегда возвращает 9, но когда таблица пытается получить первую колонку по индексу 0, выясняется, что дефолтная модель колонок (не таблицы) - пустая. Выбрасывается исключение. Как при редактировании строк можно обнулить  DefaultTableColumnModel я не представляю.

Автор: STIM 1.4.2012, 09:01
Цитата(dorogoyIV @ 31.3.2012,  15:19)

я бы добавил метод setValueAt(Object value, int row, int column) ...
тогда изменения сохранялись бы в модели, а щас у ТС неизвестно куда изменения в таблице попадают  smile

Спасибо, помогло.
Хотя нет, реже появляться стали.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)