JAvaエラーjava.lang.UnsupportedOperationException

2103 ワード

問題の説明:
コードにはArrays.asList(strings)が使用されている.配列をListに変換
次にadd(「test 3」)を使用して新しい要素を追加するときに問題が発生しました.コードは以下の通りです.
String[] strings = new String[]{"test1", "test2"};
List propertyTypeEnums = Arrays.asList(strings);
try {
    propertyTypeEnums.add("test3");
} catch (Exception e) {
    e.printStackTrace();
}

次のように誤報する
java.lang.UnsupportedOperationException
	at java.util.AbstractList.add(AbstractList.java:148)
	at java.util.AbstractList.add(AbstractList.java:108)

問題の分析:
ソースコードの表示:Arrays.asList()メソッドにより最終的にArrayListに戻る
public static  List asList(T... a) {
    return new ArrayList<>(a);
}

このArrayListはArraysの内部クラス、すなわちjava.util.Arrays$ArrayListです
package java.util;

public class Arrays {

    private static class ArrayList extends AbstractList
        implements RandomAccess, java.io.Serializable
    {...}
}

一般的なjava.util.ArrayListではありません
package java.util;

public class ArrayList extends AbstractList
        implements List, RandomAccess, Cloneable, java.io.Serializable
{

    public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }

}

JAva.util.ArrayListとjava.util.Arrays$ArrayListはjava.util.AbstractListから継承されています.addメソッドが書き換えられているのとは異なります
書き換えない場合は、親addメソッドが呼び出されます.このメソッドはデフォルトでU n s p p p p o rtedOperationExceptionを放出します.
package java.util;

public abstract class AbstractList extends AbstractCollection implements List {

    public void add(int index, E element) {
        throw new UnsupportedOperationException();
    }

}

問題解決:
new ArrayList()方式で変換
List propertyTypeEnums = new ArrayList(Arrays.asList(strings));
try {
    propertyTypeEnums.add("test3");
} catch (Exception e) {
    e.printStackTrace();
}