Java 在ArrayList上操作时,AbstractList.remove()中的UnsupportedOperationException
Java 在ArrayList上操作时,AbstractList.remove()中的UnsupportedOperationException,java,list,iterator,arraylist,Java,List,Iterator,Arraylist,ArrayList的列表迭代器确实实现了remove方法,但是,我抛出了以下异常: UnsupportedOperationException at java.util.AbstractList.remove(AbstractList.java:144) 根据该守则: protected void removeZeroLengthStringsFrom(List<String> stringList) { ListIterator<String> iter =
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();
}
}
}
protectedvoid removeZeroLengthStringsFrom(列表stringList)
{
ListIterator iter=stringList.ListIterator();
字符串s;
while(iter.hasNext())
{
s=iter.next();
如果(s.length()==0)
{
iter.remove();
}
}
}
我错过了什么?我已经验证了我传递的列表确实是ArrayList
谢谢 我怀疑是否向您传递了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();
}
}
public void remove(){
如果(lastRet==-1)
抛出新的非法状态异常();
checkForComodification();
试一试{
AbstractList.this.remove(lastRet);
if(lastRet
我认为您可能正在使用数组
实用程序获取传递到该方法中的列表
。该对象的类型确实是ArrayList
,但它是java.util.Arrays.ArrayList
,而不是java.util.ArrayList
java.util.Arrays.ArrayList
版本是不可变的,其remove()
方法不会被覆盖。因此,它遵从remove()
的AbstractList
实现,它抛出一个不支持的操作异常
是否有多个线程在同一List
上运行?我建议您验证stringList
的运行时类型是否确实是java.util.ArrayList类型。我怀疑您可能有一个向量
或堆栈
,或者一个数组列表
来自某个不同的包,它没有覆盖删除(int)
。您是如何验证它的?您是否直接检查了removeZeroLengthStringsFrom()
中的stringList.getClass()
等?解决方案是什么?!!解决方案如下:新的ArrayList(Arrays.asList(“a”、“b”、“c”))有两种可能的解决方案。第一,正如Kong所暗示的,是创建不可变ArrayList的副本并将其传入。第二个,也是更可取的(在我看来),解决方案是重写remove…
以返回一个列表,并在方法中构造一个新的可变列表,将其返回给调用者。该解决方案并不总是合理的(例如,如果您被挂接到一个无法修改的框架中),但是O(n)(迭代)比O(2n)(复制然后迭代)稍微好一点。