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!


Solution 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.

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