前言:做開發一定要注意細節,要學會看底層代碼分析一些異常。
在開發過程對List進行操作時報錯java.lang.UnsupportedOperationException,仔細查看代碼,初步發現該List是由數組轉換而成,通過源碼找到問題根源。
示例代碼:
List<String> strArrays = Arrays.asList(str);
strArrays.remove(appMarkId);
執行結果:
java.lang.UnsupportedOperationException
at java.util.AbstractList.remove(AbstractList.java:161)
at java.util.AbstractList$Itr.remove(AbstractList.java:374)
at java.util.AbstractCollection.remove(AbstractCollection.java:293)
at com.yazoneast.qdp.feature.statistic.client.handler.DynamicDataSourceRestHandler.removeDataSource(DynamicDataSourceRestHandler.java:141)
發生問題原因:
調用Arrays.asList()生產的List的add和remove方法出現異常,這是因爲Arrays.asList()返回的是Arrays的內部類ArrayList而不是java.util.ArrayList。Arrays的內部類ArrayList都是繼承了AbstractList,AbstractList中的add、set、remove方法都默認throw new UnsupportedOperationException()。
源碼:
解決方法:
List<String> arrList = new ArrayList<>(strArrays);