今天启动一个项目出错,异常为:java.lang.UnsupportedOperationException
出错的语句是:
cs.add("classpath:/com/easyjf/web/easyjf-web.xml");
cs是一个list:
List cs=new java.util.ArrayList();
这个错误有点诡异了,一个list添加一个字符串是很常用的一个操作,为什么在这里却不支持呢?
原来是因为前面用了这样一个语句:
if(this.configures!=null){
cs=java.util.Arrays.asList(this.configures);
}
问题就出在这个asList()方法了。我打开这个方法的代码看了一下:
public static List asList(T... a) {
return new ArrayList(a);
}
这里的ArrayList可不是我们常用的java.util.ArrayList哦,它是Arrays的一个内部类,继承自AbstractList:
private static class ArrayList extends AbstractList
implements RandomAccess, java.io.Serializable
{
private static final long serialVersionUID = -2764017481108945198L;
private final E[] a;
ArrayList(E[] array) {
if (array==null)
throw new NullPointerException();
a = array;
}
......
}
这个类没有add方法,但是它的父类AbstractList有一个add方法:
public boolean add(E e) {
add(size(), e);
return true;
}
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
问题就在这里了,异常就是在执行add()方法的时候出现的,因为执行了cs=java.util.Arrays.asList(this.configures),所以再执行cs的add方法的时候就会出错。
我看了一下代码,这样设计应该是为了防止add的时候改变了原来的Arrays。因为在Arrays类的内部类ArrayList只持有数组参数的一个引用,如果这个ArrayList允许执行add操作的话会改变原来的数组元素。