項目場景:
某日在開發過程中,建立一個集合對象,寫得好好地,居然報錯了,報了個UnsupportedOperationException異常。
問題描述:
@Override
public void run() {
List<String> strs = Arrays.asList("111");
strs.add("123");
}
由Arrays.asList靜态方法得到的數組使用add方法,報錯,棧資訊如下
java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
at cn.koala.JavaApplicationTests.ExceptionTest(JavaApplicationTests.java:106)
原因分析:
檢視Arrays.asList方法
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
- 傳進一個泛型,return建立的ArrayList,沒毛病,再往裡點
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
{
private static final long serialVersionUID = -2764017481108945198L;
private final E[] a;
ArrayList(E[] array) {
a = Objects.requireNonNull(array);
}
- 看到這裡就夠了,ArrayList内部的a變量,是final類型的 ,傳進泛型以後,return的ArrayList就是final的,對一個final的集合進行add操作,導緻了這次報錯。
解決方案:
如果非要用Arrays.asList()的出參作為一個新的集合,可以将其作為new ArrayList<>()的入參,如下
List<String> strs = new ArrayList<>(Arrays.asList("111"));
strs.add("123");
這樣對strs進行操作是不會報錯的