壹哥在教课的过程中,经常会让大家思考如何才能让自己一点点成为一个经验丰富的开发大神。我觉得成为大神的一个方法就是,要养成良好的学习习惯,比如记录学习开发过程中遇到的每一个难题。

一. bug 重现

这不,最近壹哥的一个学生在写代码时,使用Arrays.asList()工具类想把数组转换成集合,然后他想在数组转换的集合中再添加新的元素,结果莫名其妙地抛出了
UnsupportedOperationException 异常,这是怎么产生的呢?于是我就把这个异常产生的原因和解决过程记录了下来,供大家参考来养成自己的学习习惯。

核心代码如下:

public static void main(String[] args) {
// 1 构建原始的数组
String[] strArray = new String[] { "i", "love" };
// 2 通过Arrays.asList 工具把数组转成List 集合
List<String> strList = Arrays.asList(strArray);
// 3 往集合中添加元素
strList.add("you");
}

运行结果如下:

UnsupportedOperationException异常解决_List

二. bug原因分析

就这么几行代码,竟然会产生这样的一个异常,我这个学生心态都有点崩了。那上面的异常到底是怎么产生的呢?

我们打开Arrays.asList()方法的源码,从源码中可以发现: asList()方法的返回值是一个Arrays内部类--ArrayList,而该类并没有实现List集合的修改方法Arrays.asList()采用的是适配器模式,只是转换了接口,后台的数据结构其实仍是数组,所以我们不能直接利用asList()方法返回的集合进行添加修改等操作!

UnsupportedOperationException异常解决_数组_02

 

三. 异常解决

所以,分析源码后我们就可以找到解决办法了,即只需要把数组转成的集合,通过ArrayList的构造方法,构造一个新的集合就可以完美解决该问题了!解决代码如下:

public static void main(String[] args) {
// 1 构建原始的数组
String[] strArray = new String[] { "i", "love" };
// 2 通过Arrays.asList 工具把数组转成List 集合
List<String> strList = Arrays.asList(strArray);
// 3 把strList 包装成一个新的ArrayList
List<String> newStrList = new ArrayList<>(strList);
// 4 往新的集合中添加新元素
newStrList.add("you");
}

现在你知道这个异常是怎么产生的,怎么解决的了吗?如果你还有什么疑问,可以在评论区给壹哥留言哦。