简体   繁体   中英

UnsupportedOperationException in AbstractList.remove() when operating on ArrayList

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!

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 .

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM