天天看點

java.lang.UnsupportedOperationException——Collections.emptyList()和Arrays.asList 源碼分析

某天碰到這樣一個報錯:

java.lang.UnsupportedOperationException

不支援的操作異常,然後就去檢查代碼,發現了這個List方面的坑。

同僚的代碼中有一個方法A中在其中一種情況下,return Collections.emptyList(); 然後他在另一個方法B中調用了這個A方法,對A方法傳回的結果進行了繼續操作,比如 list.add("xxx");這個地方就報錯了。

然後去檢視了Collections.emptyList()的源碼,如下:

java.lang.UnsupportedOperationException——Collections.emptyList()和Arrays.asList 源碼分析

這個EmptyList是Collections中的一個内部類,繼承了AbstractList這個抽象類。

java.lang.UnsupportedOperationException——Collections.emptyList()和Arrays.asList 源碼分析

接下裡檢視AbstractList,

java.lang.UnsupportedOperationException——Collections.emptyList()和Arrays.asList 源碼分析

原因找到了,父類中就是直接抛出這個異常,子類也并沒有重寫這個方法。

Arrays.asList()方法也有這樣類似的問題,這個方法傳回的ArrayList是下面這個Arrays中的内部類,存在上述同樣的問題。

java.lang.UnsupportedOperationException——Collections.emptyList()和Arrays.asList 源碼分析

是以在使用這些方法傳回List的時候,如果需要對傳回的List進行增删之類的操作,不要直接操作,可通過new ArrayList<>(list); 生成一個新的List再進行操作,進而避免這個問題

以上。