java-在ArrayList上进行操作时AbstractList.remove()中出现UnsupportedOperationException

List<String>的列表迭代器确实实现了remove方法,但是,我抛出了以下异常:

UnsupportedOperationException at 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>

谢谢!

bguiz asked 2020-07-28T05:05:27Z
2个解决方案
128 votes

我想您可能正在使用java.util.Arrays.ArrayList实用程序来获取传递给该方法的remove()905。 该对象确实是AbstractList类型,但它是remove(),而不是UnsupportedOperationException

java.util.Arrays.ArrayList版本是不可变的,其remove()方法不会被覆盖。 因此,它遵循remove()906的remove()实现,该实现抛出UnsupportedOperationException

Mike M answered 2020-07-28T05:17:02Z
2 votes

我怀疑您是否正在传递ArrayList,因为ArrayList迭代器上的remove方法不会引发该异常。

我猜测您正在传递ArrayList的用户派生类,该类的迭代器确实在remove上引发了该异常。

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();
    }
}
MeBigFatGuy answered 2020-07-28T05:17:27Z
translate from https://stackoverflow.com:/questions/6260113/unsupportedoperationexception-in-abstractlist-remove-when-operating-on-arrayli