java.lang.UnsupportedOperationException 原因與解法

對 List 新增、刪除是很基本的行為
但居然出現「不支持的操作」異常
這是為什麼呢?

Integer[] array = new Integer[] {1, 2, 3};
List<Integer> list = Arrays.asList(array);

list.add(4); // UnsupportedOperationException
list.remove(0); // UnsupportedOperationException

原因是 Arrays.asList() 方法所 return 的 ArrayList
是 Arrays.class 中的 private class
並非一般認知的 java.util.ArrayList

Arrays$ArrayList 並未實作 add 與 remove 方法
所以會往上呼叫所繼承的 AbstractList
而 AbstractList.add() 與 AbstractList.remove()
會直接拋出 UnsupportedOperationException

最終出現的異常訊息如下
問題的確發生於 java.util.AbstractList

java.util.AbstractList.add(AbstractList.java:153)
java.util.AbstractList.add(AbstractList.java:111)

java.util.AbstractList.remove(AbstractList.java:167)

官方的 Javadoc comment 也說明
此方法產生的 List 是固定長度的

解決

使用 Arrays.asList() 方法所產生的 List 無法增刪
若要增刪,需要再轉成 java.util.ArrayList

List<Integer> list = new ArrayList<Integer>(Arrays.asList(array));