網頁

2019/5/3

Java 為什麼使用Arrays.asList()產生的List物件呼叫add()或remove()時出現UnsupportedOperationException錯誤?

如果你用Arrays.asList(T... a)產生List物件,而當你在呼叫Listadd()remove()新增或刪除元素時,會發生java.lang.UnsupportedOperationException錯誤。


例如以下範例會丟出UnsupportedOperationException錯誤

List<Integer> list = Arrays.asList(1,2,3,4,5);
list.add(6); // 丟出 java.lang.UnsupportedOperationException 錯誤

原因是Arrays.asList(T... a)回傳的並不是java.util.ArrayList,而是Arrays$ArrayList,也就是java.util.Arrays的一個內部類別,而這個Arrays$ArrayList並未實作上述的add(),因此實際呼叫的是其繼承的父類別AbstractList,所以真正呼叫的是AbstractList.add(E e),最終呼叫的是AbstractList.add(int index, E element),原始碼如下。

public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
 ...
    public void add(int index, E element) {
        throw new UnsupportedOperationException();
    }
 ...
}

所以可以將其轉成ArrayList如下就不會有上述錯誤了。

List<Integer> list = new ArrayList<>(Arrays.asList(1,2,3,4,5));
list.add(6);

參考:

沒有留言:

張貼留言