Java列表UnsupportedOperationException

1.概述

在本快速教程中,我們將討論使用大多數List實現的某些API時可能發生的常見Exception - UnsupportedOperationException

java.util.List具有比rray所支持的普通功能更多的功能。例如,僅使用一個內置方法調用,就可以檢查結構中是否有特定元素。這通常就是為什麼我們有時需要將array轉換為ListCollection

有關核心Java List實現ArrayList的介紹,請參考本文。

2. UnsupportedOperationException

發生此錯誤的常見方式是當我們使用java.util.Arrays: asList()方法時java.util.Arrays:

public static List asList(T... a)

它返回:

  • 給定array大小的固定大小List
  • 與原始array元素類型相同的元素,並且它必須是一個Object
  • 元素以相同順序 如原始陣列
  • serializable並實現[RandomAccess](https://docs.oracle.com/javase/7/docs/api/java/util/RandomAccess.html)的列表

由於T是一個varargs ,我們可以直接將數組或項目作為參數傳遞,該方法將創建一個固定大小的初始化列表:

List<String> flowers = Arrays.asList("Ageratum", "Allium", "Poppy", "Catmint");

我們還可以傳遞一個實際的array

String[] flowers = { "Ageratum", "Allium", "Poppy", "Catmint" };

 List<String> flowerList = Arrays.asList(flowers);

由於返回的List是固定大小的List ,因此我們無法添加/刪除元素

嘗試添加更多元素將導致UnsupportedOperationException

String[] flowers = { "Ageratum", "Allium", "Poppy", "Catmint" };

 List<String> flowerList = Arrays.asList(flowers);

 flowerList.add("Celosia");

Exception的根源是,由於返回的對象與java.util.ArrayList.不同,因此不執行add()操作java.util.ArrayList.

這是一個java.util.Arrays.ArrayList java.util.Arrays.

獲取相同異常的另一種方法是嘗試從獲取的列表中刪除一個元素。

另一方面,有一些方法可以在需要時獲取可變List

其中之一是直接從asList()的結果創建ArrayList或任何種類的列表:

String[] flowers = { "Ageratum", "Allium", "Poppy", "Catmint" };

 List<String> flowerList = new ArrayList<>(Arrays.asList(flowers));

3.結論

總之,重要的是要理解,將更多的元素添加到列表中不僅對不可變的列表可能會帶來問題。

與往常一樣,示例的完整源代碼可在GitHub上獲得