Java List中的 UnsupportedOperationException

评论 0 浏览 0 2018-04-15

1.概述

在这个快速教程中,我们将讨论一个常见的Exception,当使用大多数List实现的API时,可能会发生 – UnsupportedOperationException

一个java.util.List具有比普通array所能支持的更多功能。例如,只用一个内置的方法调用,就可以检查一个特定的元素是否在结构内。这就是为什么我们有时需要将一个array转换为ListCollection

关于Java核心的List implementation – ArrayList – 的介绍,请参考到这篇文章

2.不支持的操作异常

这种错误经常发生的情况是,当我们使用java.util.Arrays中的asList()方法时:

public static List asList(T... a)

它的返回是:

  • 一个固定大小的List与一个给定的数组的大小相同。
  • 一个与原始array中的元素类型相同的元素,并且它必须是一个Object
  • 元素的顺序与原数组中的顺序相同
  • 一个列表,它是可序列化的,并且实现了随机访问的。

由于T是一个泛型参数,我们可以直接传递一个数组或项目作为参数,该方法将创建一个固定大小的初始化列表。

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

我们也可以传入一个实际的数组

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的根源在于,返回的对象没有实现add()操作,因为它与java.util.ArrayList不一样。

它是一个ArrayList,来自java.util.Arrays的。

另一种获得相同异常的方法是试图从获得的列表中删除一个元素。

另一方面,有一些方法可以获得一个可变的List,以备我们需要它。

其中之一是直接从asList()的结果中创建一个ArrayList或任何种类的列表。

String[] flowers = { "Ageratum", "Allium", "Poppy", "Catmint" }; 
List<String> flowerList = new ArrayList<>(Arrays.asList(flowers));

3.总结

总之,重要的是要明白,向一个列表中添加更多的元素,不是不可变的列表,可能会出现问题。

一如既往,这些示例的完整源代码可在GitHub上获得。

最后更新2023-03-11
0 个评论