在ArrayList上操作时,AbstractList.remove()中的UnsupportedOperationException
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在ArrayList上操作时,AbstractList.remove()中的UnsupportedOperationException相关的知识,希望对你有一定的参考价值。
ArrayList
的列表迭代器确实实现了remove方法,但是,我得到以下抛出的异常:
UnsupportedOperationException at 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();
}
}
}
我在这里错过了什么?我已经证实我传入的List<String>
确实是ArrayList<String>
。
谢谢!
答案
我想你可能正在使用Arrays
实用程序来获取你传递给该方法的List
。该对象确实是ArrayList
类型,但它是java.util.Arrays.ArrayList
,而不是java.util.ArrayList
。
java.util.Arrays.ArrayList
版本是不可变的,它的remove()
方法没有被覆盖。因此,它遵循AbstractList
实施remove()
,投掷UnsupportedOperationException
。
另一答案
我怀疑你是否被传递给ArrayList,因为ArrayList迭代器上的remove方法不会抛出该异常。
我猜你正在传递一个用户派生类的ArrayList,它的迭代器会在删除时抛出该异常。
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();
}
}
以上是关于在ArrayList上操作时,AbstractList.remove()中的UnsupportedOperationException的主要内容,如果未能解决你的问题,请参考以下文章
对 ArrayList 进行操作时,AbstractList.remove() 中出现 UnsupportedOperationException