欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

String数组转化List数组之java.lang.UnsupportedOperationException异常问题

程序员文章站 2022-06-11 10:44:00
...

首先先简单的看一个例子

 public static void main(String[] args) {
        String []  s = {"4","3"};
		List<String> list = Arrays.asList(s);
		list.add("2");
		System.out.println(list.size());
 }

这段代码看起来好像没啥子问题撒,编译正常,但是运行之后就会发现不是你想要的样子,为什么呢,来,瞜一眼报错看看

Exception in thread "main" java.lang.UnsupportedOperationException
	at java.util.AbstractList.add(Unknown Source)
	at java.util.AbstractList.add(Unknown Source)
	at com.cn.xhwang.safety.utils.RegexType.main(RegexType.java:61)

这家伙报错报的一脸懵逼,不晓得要干啥,正逢冬天都想直接出去打一场走医疗保险的雪仗,注意,这儿不是说调用list的add方法会报错,而是操作list都会报错,包括那些remove...

来,我们先提供解决方案,将String数组转化为list数组之后,如果要操作数组,还需转化为java.util.ArrayList对象,这个样子就可以了

List<String> list = new ArrayList<String>(Arrays.asList(s));

接下来,我们再看看为什么报这样的错,为什么要这样解决,来,我们先看看源码里面是怎么解释的,

String数组转化List数组之java.lang.UnsupportedOperationException异常问题

查看Arrays源码,我们发现这个一个信息,调用aslist方法,返回了一个 new ArrayList,换句话说(返回的是Arrays的内部类ArrayList,而不是java.util.Arraylist)而这个内部类ArrayList继承自abstractList,那我们先来看看abstractList里面对于操作数组是提供了一个什么接口

String数组转化List数组之java.lang.UnsupportedOperationException异常问题

纳尼,父类提供了一个方法,方法里面默认new了一个异常,咋 的一看,这个异常好熟悉,这不就是我们报错的异常吗,对喽,这个异常就是一开始测试方法里面包的异常,那么,问题来了,为什么会报这个异常呢,来,我们返回来接着看Arrays源码,里面的ArrayList既然继承了abstractList,那么我们来看看它对父类里面的这些方法进行了什么操作,找了一圈,我们惊奇的发现而Arrays的内部类ArrayList根本没有重写这些方法,所以在我们调用Arrays.asList(s).add的时候,他默认使用了父类的方法,这样,异常就自然而然的报出来了....咳,呸,真懒

接下来,就到高潮部分了,既然知道了为什么报错,那我们怎么去解决它呢,我们就想到了java.util.Arraylist,有些人这儿就迷茫了,上面那个不也是Arraylist吗?对,你说的没错,字面意思确实是一样,但是Arrays源码里面那个Arraylist是一个内部类,现在我们说的是java.util.Arraylist,他两可是有本质上的区别,来我们看看java.util.Arraylist的源码

String数组转化List数组之java.lang.UnsupportedOperationException异常问题

刚开头,我们就发现了这一段代码,显然,它也是继承了abstractList,那么我们看下它里面对于那些操作数组的方法有咩有进行重写,接着我们就找到了这么一段代码

String数组转化List数组之java.lang.UnsupportedOperationException异常问题

重写了!!!,它把它爹的宏图大志完成了,所以说,还是亲生的好,这就明白了一开始我们为什么要那样解决了,其实,总结起来就是原因是因为Arrays.aslist(s)返回的是Arrays的内部类ArrayList,而不是java.util.Arraylist,Arrays的内部类ArraysList和java.util.ArraysList都继承
 abstractList,而在abstractList中这些add,remove,方法都默认是throw UnsupportedOperationException而不做任何操作,在java.util.ArrayList中
 重写了这些方法,而Arrays的内部类ArrayList没有重写这些方法,所以会报错,  所以在此处将String数组转化为list数组之后,如果要操作数组,还需转化为java.util.ArrayList对象

以上均为个人观点,如果错误之处,还望不吝指出