概述
本节将讨论一个常见的 Java 异常 java.lang.UnsupportedOperationException
,在使用某些 List 的 API 时,可能会发生 UnsupportedOperationException
。
java.util.List
比普通的数组 array 有更多的功能,因此,我们经常将数组转换为 List 或者 Collection对象.
关于快速初始化 List,这里有介绍 一行代码初始化ArrayList
异常 UnsupportedOperationException
发生此错误的常见方式是当我们使用 java.util.Arrays 中的 asList() 方法时:
public static List asList(T... a)
请注意该方法的返回值:
- 固定大小(不可变数组)
- 与原数组中元素类型相同
- 与原数组中元素顺序相同
- 实现了 Serializable 和 RandomAccess,可序列化与随机访问
参数 T 是变长参数 varargs ,使用时可以直接传值:
List<String> students = Arrays.asList("Angle", "Bill", "Cicy", "Duck");
或者传入一个数组:
String[] students = { "Angle", "Bill", "Cicy", "Duck"};
List<String> studentList = Arrays.asList(flowers);
由于生成的 List 是固定大小的,因此不能进行 添加 或者 删除 操作。
studentList.add("Ela");
尝试添加元素,将会导致异常 UnsupportedOperationException
。
出现该异常的原因是生成的 List 没有实现 add()
方法,它并不是我们熟知的 java.util.ArrayList
,而是 java.util.Arrays
中的 ArrayList
。
当然,如果你尝试从中删除一个元素,也会导致异常 UnsupportedOperationException
。
那么,如何将上面的代码改造成可以修改的 List ?
String[] students = { "Angle", "Bill", "Cicy", "Duck"};
List<String> studentList = new ArrayList<>(Arrays.asList(flowers));
稍加修改,就能得到可变列表 List。