天一博客
天一博客
EasyJF官方博客
我的首页
文章
相册
圈子
留言
管理
 
    当前所在页面:首页>>文章>>Arrays的asList()方法得到的是怎样的一个List
Arrays的asList()方法得到的是怎样的一个List
    作者:天一 来源:www.easyjf.com 发表时间:2008-02-16

 
 

今天启动一个项目出错,异常为: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操作的话会改变原来的数组元素。

 

 
 

(阅读 )   评论数(:1)
评论】 【收藏】
评论:共1条
这是比较细致的bug,对jdk的底层api不熟悉就会出错,而且还不容易找到哈。
评论人: 大峡     评论时间: 2008-02-17 15:25:26

发表评论:
发表人:
评论: 
    
 
关于我们 | 诚聘英才 | 联系我们 | 广告业务 | 网站地图 | 法律声明

EasyJF开源团队版权所有  建议使用1024*768分辨率