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)(复制然后迭代)稍微好一点。