在開發中,有時候會碰到把多個參數,或者說把數組轉成List的需求,一般咱們會使用 Arrays.asList()方法。可是該方法在使用的過程當中,稍有不慎就會出現嚴重的異常。有以下代碼:java
@Test
public void test() {
List<String> list = Arrays.asList("a", "a", "2");
System.out.println(list.size());
list.add("blog.happyjava.cn");
System.out.println(list.size());
}
複製代碼
運行以後,出現了異常:數組
在阿里Java規約中有強制性的要求:使用工具類 Arrays.asList()把數組轉換成集合時,不能使用其修改集合相關的方法,它的 add/remove/clear 方法會拋出 UnsupportedOperationException 異常。app
阿里規約裏已經提示了asList返回的對象是Arrays的一個內部類。那麼這個內部類,跟咱們通常用到的List(如ArrayList)有什麼不同之處呢,下面咱們就來分析下。工具
經過IDEA查看該方法源碼,以下:源碼分析
這裏返回了一個ArrayList,看起來彷佛沒什麼問題,可是這個ArrayList跟咱們經常使用的java.util.ArrayList不同。經過IDEA點擊跳轉,能夠看到該ArrayList是Arrays的一個內部類。spa
該內部類的源碼其實很少,經過IDEA的structure,咱們能夠看到它實現的方法以下:code
能夠看到,這裏是沒有實現咱們最經常使用的add方法的。cdn
那麼,調用add等方法的時候,UnsupportedOperationException 異常是哪裏拋出來的呢?咱們看它繼承的java.util.AbstractList類,該類的add方法以下:對象
public boolean add(E e) {
add(size(), e);
return true;
}
複製代碼
這裏有一個重載的add方法,再點進去查看:blog
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
複製代碼
能夠看到,是這裏拋出了UnsupportedOperationException。
Arrays.asList()是開發中很是經常使用的方法,因此咱們必定要了解其存在的坑點。若是把其返回的ArrayList當作了咱們經常使用的java.util.ArrayList,那麼是很容易埋下生產隱患的。