异常信息如下:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:151)
at java.util.AbstractList.add(AbstractList.java:89)
at main(TesException.java:20)
1.该异常出现在调用Arrays.asList方法后的List集合调用add,remove,removeAll方法时。 如:
List a = Arrays.asList(String []);
a.remove("test");
2.原因
查看源码可知,Arrays.asList()方法返回类型为Arrays$ArrayList。该类型为Arrays内自己实现的ArrayList类,与常用的java.util.ArrayList实现有所不同,具体如下:
Arrays$ArrayList:
实现的方法:
java.util.ArrayList:
实现的方法:
可见Arrays.asList并没有实现cloneable接口,因此调用clone()方法则会报错。
其继承父类AbstractList但又没有实现自己的add,remove等方法。而在AbstractList中,调用add,remove等方法会抛出异常
之所以没有异常提示,是因为AbstractList实现List接口
在使用时采取向上转型的方式如 List fu = Arrays.asList(String[]);
父类包含了子类没有重写的方法,使用fu.add(E e);时优先选择了Arrays$ArrayList继承自AbstractList中的add,因此报
UnSupportException。
3.解决办法:
解决办法很简单,将该List转为java.util包下的实现List接口的其他List,如:
List list = Arrays.asList(a[]);
List arrayList = new ArrayList(list);