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

ArrayList的列表迭代器确实实现了remove方法,但是我得到了下面的exception抛出:UnsupportedOperationException 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(); } } } 

我在这里错过了什么? 我已经validation了我传入的List<String>确实是ArrayList<String>

谢谢!

我想你可能正在使用Arrays实用程序来获取您传入该方法的List 。 该对象确实是ArrayListtypes的,但它是java.util.Arrays.ArrayList ,而不是java.util.ArrayList

java.util.Arrays.ArrayList版本是不可变的,它的remove()方法不会被覆盖。 因此,它遵循remove()AbstractList实现,抛出一个UnsupportedOperationExceptionexception。

我怀疑你正在传递一个ArrayList,因为ArrayList迭代器上的remove方法不会引发这个exception。

我猜你正在传递一个ArrayList的用户派生类,他的迭代器在移除时抛出exception。

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