天天看點

Java記錄java.lang.UnsupportedOperationException異常解決項目場景:問題描述:原因分析:解決方案:

項目場景:

某日在開發過程中,建立一個集合對象,寫得好好地,居然報錯了,報了個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進行操作是不會報錯的