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