Java使用Arrays.asList報(bào)UnsupportedOperationException的解決
項(xiàng)目場(chǎng)景:
查詢多個(gè)名銷售的銷售業(yè)績(jī),上層要求要在查詢銷售的業(yè)績(jī)同事也要查看到每年的年度銷售冠軍,于是前端傳遞的是以“,”分割開的字符串。測(cè)試的時(shí)候就報(bào)錯(cuò)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)**創(chuàng)建的 **return new ArrayList<>(a);**以為是java.util包下的,所以就對(duì)它增刪改了。查看源碼發(fā)現(xiàn),該方法并不支持增刪改 源碼如下:
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);
}
}
通過以上源碼發(fā)現(xiàn),Arrays內(nèi)部實(shí)現(xiàn)的ArrayList并未實(shí)現(xiàn)增刪改等的操作,繼承了 AbstractList.class 類中拋出的 UnsupportedOperationException異常。源碼如下:
##只粘貼了部分源碼,詳情可以去AbstractList.class中查看
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
總結(jié):
Arrays.asList(T .....a)不能進(jìn)行增刪改等操作。在使用一下類的時(shí)候,看下源碼會(huì)避免一些代碼層的坑。
到此這篇關(guān)于Java使用Arrays.asList報(bào)UnsupportedOperationException的解決的文章就介紹到這了,更多相關(guān)Arrays.asList報(bào)UnsupportedOperationException內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決mybatis使用char類型字段查詢oracle數(shù)據(jù)庫(kù)時(shí)結(jié)果返回null問題
這篇文章主要介紹了mybatis使用char類型字段查詢oracle數(shù)據(jù)庫(kù)時(shí)結(jié)果返回null問題的解決方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-06-06
classloader類加載器_基于java類的加載方式詳解
下面小編就為大家?guī)硪黄猚lassloader類加載器_基于java類的加載方式詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10
Java之SpringCloudAlibaba Sentinel組件案例講解
這篇文章主要介紹了Java之SpringCloudAlibaba Sentinel組件案例講解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
Spring?Boot?+?Mybatis?Plus實(shí)現(xiàn)樹狀菜單的方法
這篇文章主要介紹了Spring?Boot?+?Mybatis?Plus實(shí)現(xiàn)樹狀菜單,包括實(shí)體類中添加子菜單列表和集合及構(gòu)建菜單樹的詳細(xì)代碼,代碼簡(jiǎn)單易懂,需要的朋友可以參考下2021-12-12
Java System.currentTimeMillis()時(shí)間的單位轉(zhuǎn)換與計(jì)算方式案例詳解
這篇文章主要介紹了Java System.currentTimeMillis()時(shí)間的單位轉(zhuǎn)換與計(jì)算方式案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08

