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

时间:2011-06-07 02:34:46

标签: java list iterator arraylist

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>

谢谢!

2 个答案:

答案 0 :(得分:127)

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

java.util.Arrays.ArrayList版本是不可变的,并且不会覆盖其remove()方法。因此,它遵循AbstractList的{​​{1}}实施,它会引发remove()

答案 1 :(得分:2)

我怀疑你是否正在传递一个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();
    }
}