在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
。 该对象确实是ArrayList
types的,但它是java.util.Arrays.ArrayList
,而不是java.util.ArrayList
。
java.util.Arrays.ArrayList
版本是不可变的,它的remove()
方法不会被覆盖。 因此,它遵循remove()
的AbstractList
实现,抛出一个UnsupportedOperationException
exception。
我怀疑你正在传递一个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(); } }