web-dev-qa-db-ja.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>であることを確認しました。

ありがとう!

45
bguiz

Arraysユーティリティを使用して、そのメソッドに渡すListを取得している可能性があります。オブジェクトは確かにタイプArrayListですが、_Java.util.Arrays.ArrayList_ではなく_Java.util.ArrayList_です。

_Java.util.Arrays.ArrayList_バージョンは不変であり、そのremove()メソッドはオーバーライドされません。そのため、AbstractListをスローするremove()UnsupportedOperationException実装に依存します。

131
Mike M

ArrayListイテレータのremoveメソッドがその例外をスローしないため、ArrayListが渡されているとは思いません。

イテレータが削除時にその例外をスローする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();
    }
}
2
MeBigFatGuy