Почему выбрасывается IndexOutOfBoundsException - PullRequest
0 голосов
/ 28 апреля 2011

Ниже кода генерируется исключение IndexOutOfBoundsException в строке Field f = getField (counter);Почему его бросают?Конечно, поле существует, потому что я зацикливаюсь на основе fieldcount.Или список полей в менеджере не гарантированно является последовательным?Если это так, как я должен удалить поля с экрана, которые имеют тип - MyButtonField

Спасибо

        int fieldCount = getFieldCount() - 1;
        if(fieldCount > 1){
            for(int counter = 0; counter <= fieldCount ; ++counter){
                Field f = getField(counter);
                if(f instanceof MyButtonField){                 
                    delete(f);  
                }
            }
        }

Ответы [ 2 ]

5 голосов
/ 28 апреля 2011

Вы не указали, что делает delete(f), но если он удалит его из списка полей, то ваш «действительный счет» будет эффективно уменьшаться.

Чтобы переписать это несколько и решить проблему:

for (int index = getFieldCount() - 1; index >= 0; index--){
    Field f = getField(index);
    if (f instanceof MyButtonField) {
        delete(f);  
    }
}

Это будет идти от конца полей вместо начала , поэтому не имеет значения, удаляете ли вы запись, и все перемешивается - элементы, которые перемешиваются те, на которые вы уже смотрели.

1 голос
/ 28 апреля 2011

Лучший способ - использовать Iterator для итерации, а затем вызвать метод remove ().Пример:

        for(Iterator it = getFields().iterator();it.hasNext()){
            Field f = (Field) it.next();
            if(f instanceof MyButtonField){                 
                it.remove();  
            }
        }

Метод getFields () должен вернуть коллекцию элементов Field.

...