在ArrayList上操作时,AbstractList.remove()中的UnsupportedOperationException

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在ArrayList上操作时,AbstractList.remove()中的UnsupportedOperationException相关的知识,希望对你有一定的参考价值。

ArrayList的列表迭代器确实实现了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>

谢谢!

答案

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

java.util.Arrays.ArrayList版本是不可变的,它的remove()方法没有被覆盖。因此,它遵循AbstractList实施remove(),投掷UnsupportedOperationException

另一答案

我怀疑你是否被传递给ArrayList,因为ArrayList迭代器上的remove方法不会抛出该异常。

我猜你正在传递一个用户派生类的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();
    }
}

以上是关于在ArrayList上操作时,AbstractList.remove()中的UnsupportedOperationException的主要内容,如果未能解决你的问题,请参考以下文章

LinkedList与ArrayList的区别(内部实现)

可变数组集合ArrayList

ArrayList和LinkedList

ArrayList 及其源码解析

Vector与ArrayList 的理解

对 ArrayList 进行操作时,AbstractList.remove() 中出现 UnsupportedOperationException