String数组转化List数组之java.lang.UnsupportedOperationException异常问题
首先先简单的看一个例子
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));
接下来,我们再看看为什么报这样的错,为什么要这样解决,来,我们先看看源码里面是怎么解释的,
查看Arrays源码,我们发现这个一个信息,调用aslist方法,返回了一个 new ArrayList,换句话说(返回的是Arrays的内部类ArrayList,而不是java.util.Arraylist)而这个内部类ArrayList继承自abstractList,那我们先来看看abstractList里面对于操作数组是提供了一个什么接口
纳尼,父类提供了一个方法,方法里面默认new了一个异常,咋 的一看,这个异常好熟悉,这不就是我们报错的异常吗,对喽,这个异常就是一开始测试方法里面包的异常,那么,问题来了,为什么会报这个异常呢,来,我们返回来接着看Arrays源码,里面的ArrayList既然继承了abstractList,那么我们来看看它对父类里面的这些方法进行了什么操作,找了一圈,我们惊奇的发现而Arrays的内部类ArrayList根本没有重写这些方法,所以在我们调用Arrays.asList(s).add的时候,他默认使用了父类的方法,这样,异常就自然而然的报出来了....咳,呸,真懒
接下来,就到高潮部分了,既然知道了为什么报错,那我们怎么去解决它呢,我们就想到了java.util.Arraylist,有些人这儿就迷茫了,上面那个不也是Arraylist吗?对,你说的没错,字面意思确实是一样,但是Arrays源码里面那个Arraylist是一个内部类,现在我们说的是java.util.Arraylist,他两可是有本质上的区别,来我们看看java.util.Arraylist的源码
刚开头,我们就发现了这一段代码,显然,它也是继承了abstractList,那么我们看下它里面对于那些操作数组的方法有咩有进行重写,接着我们就找到了这么一段代码
重写了!!!,它把它爹的宏图大志完成了,所以说,还是亲生的好,这就明白了一开始我们为什么要那样解决了,其实,总结起来就是原因是因为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对象
以上均为个人观点,如果错误之处,还望不吝指出
上一篇: django项目部署
下一篇: strtotime 对待数组怎么处理