Подтвердить что ты не робот

UnsupportedOperationException в AbstractList.remove() при работе в ArrayList

ArrayList list iterator реализует метод remove, однако я получаю следующее исключение: UnsupportedOperationException в java.util.AbstractList.remove(AbstractList.java:144)

По этому коду:

protected void removeZeroLengthStringsFrom(List<String> stringList)
{
    ListIterator<String> iter = stringList.listIterator();
    String s;
    while (iter.hasNext())
    {
        s = iter.next();
        if (s.length() == 0)
        {
            iter.remove();
        }
    }
}

Что мне здесь не хватает? Я проверил, что List<String>, который я передаю, действительно ArrayList<String>.

Спасибо!

4b9b3361

Ответ 1

Я думаю, вы можете использовать утилиту Arrays, чтобы получить List, который вы передаете этому методу. Объект действительно имеет тип ArrayList, но он java.util.Arrays.ArrayList, а не java.util.ArrayList.

Версия java.util.Arrays.ArrayList неизменна, и ее метод remove() не переопределяется. Таким образом, он отказывается от реализации AbstractList remove(), которая выдает UnsupportedOperationException.

Ответ 2

Я сомневаюсь, что вам передается ArrayList, поскольку метод remove на итераторе ArrayList не генерирует это исключение.

Я предполагаю, что вам передают пользовательский класс ArrayList, который итератор делает это исключение при удалении.

public void remove() {
    if (lastRet == -1)
    throw new IllegalStateException();
        checkForComodification();

    try {
    AbstractList.this.remove(lastRet);
    if (lastRet < cursor)
        cursor--;
    lastRet = -1;
    expectedModCount = modCount;
    } catch (IndexOutOfBoundsException e) {
    throw new ConcurrentModificationException();
    }
}