項目場景:
查詢多個名銷售的銷售業(yè)績,上層要求要在查詢銷售的業(yè)績同事也要查看到每年的年度銷售冠軍,于是前端傳遞的是以“,”分割開的字符串。測試的時候就報錯java.lang.UnsupportedOperationException的異常
代碼展示:
1
2
3
4
5
6
7
8
|
// 這里隱藏了查詢條件,所以就寫死了 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包下的,所以就對它增刪改了。查看源碼發(fā)現(xiàn),該方法并不支持增刪改 源碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
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)部實現(xiàn)的ArrayList并未實現(xiàn)增刪改等的操作,繼承了 AbstractList.class 類中拋出的 UnsupportedOperationException異常。源碼如下:
1
2
3
4
|
##只粘貼了部分源碼,詳情可以去AbstractList. class 中查看 public void add( int index, E element) { throw new UnsupportedOperationException(); } |
總結(jié):
Arrays.asList(T .....a)不能進(jìn)行增刪改等操作。在使用一下類的時候,看下源碼會避免一些代碼層的坑。
到此這篇關(guān)于Java使用Arrays.asList報UnsupportedOperationException的解決的文章就介紹到這了,更多相關(guān)Arrays.asList報UnsupportedOperationException內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://blog.csdn.net/qq_36618541/article/details/115794331