UnsupportedOperationException in AbstractList.remove() when operating on ArrayList

这一生的挚爱 提交于 2020-06-24 18:13:15

问题


ArrayList's list iterator does implement the remove method, however, I get the following exception thrown:

UnsupportedOperationException at java.util.AbstractList.remove(AbstractList.java:144)

By this code:

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();
        }
    }
}

What am I missing here? I have verified that the List<String> I am passing in are indeed ArrayList<String>.

Thanks!


回答1:


I think you may be using the Arrays utility to get the List that you pass into that method. The object is indeed of type ArrayList, but it's java.util.Arrays.ArrayList, not java.util.ArrayList.

The java.util.Arrays.ArrayList version is immutable and its remove() method is not overridden. As such, it defers to the AbstractList implementation of remove(), which throws an UnsupportedOperationException.




回答2:


I doubt you are being passed an ArrayList, as the remove method on the ArrayList iterator does not throw that exception.

I'm guessing your are being passed a user derived class of ArrayList who's iterator does throw that exception on 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();
    }
}


来源:https://stackoverflow.com/questions/6260113/unsupportedoperationexception-in-abstractlist-remove-when-operating-on-arrayli

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!