Java使用Arrays.asList報UnsupportedOperationException的解決

項目場景:

查詢多個名銷售的銷售業績,上層要求要在查詢銷售的業績同事也要查看到每年的年度銷售冠軍,於是前端傳遞的是以“,”分割開的字符串。測試的時候就報錯java.lang.UnsupportedOperationException的異常

代碼展示:

           // 這裡隱藏瞭查詢條件,所以就寫死瞭
        List<String>  performId=new ArrayList<>();
        performId.add("701728881476112384");
        performId.add("701728881497083904");
        String[] agentIds = StringUtils.split(agentId, ",");
        List<String> agentIdList = Arrays.asList(agentIds);
        // 後面同事沒有註意,就直接展示查詢出來就加入
        agentIdList.addAll(performId);

原因分析:

於是我們查看瞭源碼,通過**Arrays.asList(T …a)**創建的 **return new ArrayList<>(a);**以為是java.util包下的,所以就對它增刪改瞭。查看源碼發現,該方法並不支持增刪改 源碼如下:

 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);
        }
        @Override
        public int size() {
            return a.length;
        }
        @Override
        public Object[] toArray() {
            return a.clone();
        }
        @Override
        @SuppressWarnings("unchecked")
        public <T> T[] toArray(T[] a) {
            int size = size();
            if (a.length < size)return Arrays.copyOf(this.a, size,(Class<? extends T[]>) a.getClass());
            System.arraycopy(this.a, 0, a, 0, size);
            if (a.length > size) a[size] = null;
            return a;
        }
        @Override
        public E get(int index) {
            return a[index];
        }
        @Override
        public E set(int index, E element) {
            E oldValue = a[index];
            a[index] = element;
            return oldValue;
        }

        @Override
        public int indexOf(Object o) {
            E[] a = this.a;
            if (o == null) {
                for (int i = 0; i < a.length; i++)
                    if (a[i] == null) return i;
            } else {
              for (int i = 0; i < a.length; i++)
                   if (o.equals(a[i])) return i;
            }
            return -1;
        
        @Override
        public boolean contains(Object o) {
            return indexOf(o) != -1;
        }
        @Override
        public Spliterator<E> spliterator() {
            return Spliterators.spliterator(a, Spliterator.ORDERED);
        }
        @Override
        public void forEach(Consumer<? super E> action) {
            Objects.requireNonNull(action);
            for (E e : a) {
                action.accept(e);
            }
        }
        @Override
        public void replaceAll(UnaryOperator<E> operator) {
            Objects.requireNonNull(operator);
            E[] a = this.a;
            for (int i = 0; i < a.length; i++) {
                a[i] = operator.apply(a[i]);
            }
        }

        @Override
        public void sort(Comparator<? super E> c) {
            Arrays.sort(a, c);
        }
    }

通過以上源碼發現,Arrays內部實現的ArrayList並未實現增刪改等的操作,繼承瞭 AbstractList.class 類中拋出的 UnsupportedOperationException異常。源碼如下:

    ##隻粘貼瞭部分源碼,詳情可以去AbstractList.class中查看
    public void add(int index, E element) {
        throw new UnsupportedOperationException();
    }

總結:

Arrays.asList(T …..a)不能進行增刪改等操作。在使用一下類的時候,看下源碼會避免一些代碼層的坑。

到此這篇關於Java使用Arrays.asList報UnsupportedOperationException的解決的文章就介紹到這瞭,更多相關Arrays.asList報UnsupportedOperationException內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀:

    None Found