Java List中的 UnsupportedOperationException
评论 0
浏览 0
2018-04-15
1.概述
在这个快速教程中,我们将讨论一个常见的Exception,当使用大多数List实现的API时,可能会发生 – UnsupportedOperationException。
一个java.util.List具有比普通array所能支持的更多功能。例如,只用一个内置的方法调用,就可以检查一个特定的元素是否在结构内。这就是为什么我们有时需要将一个array转换为List或Collection。
关于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上获得。
0 个评论