程序中某段案例代码如下:
Map> tMap = new HashMap >(); tMap.put(name, Arrays.asList(new CronTrigger[] { trigger }));
程序运行抛出异常:java.lang.UnsupportedOperationException
错误原因:
为了快速创建List而使用了Arrays.asList方法,但此方法返回的ArrayList不是java.util.ArrayList对象,而是Arrays的一个内部类。
我们可以看下源码
Arrays.class: @SafeVarargs public staticList asList(T... a) { return new ArrayList<>(a); }---------------------------------------------------private static class ArrayList extends AbstractList implements RandomAccess, java.io.Serializable { private static final long serialVersionUID = -2764017481108945198L; private final E[] a; ArrayList(E[] array) { if (array==null) throw new NullPointerException(); a = array; }.....
上述代码中可以看出内部类ArrayList继承了AbstractList,但是没有重写其add方法和remove方法,AbstractList中相关代码如下:
public boolean add(E e) { add(size(), e); return true; }public void add(int index, E element) { throw new UnsupportedOperationException(); }public E remove(int index) { throw new UnsupportedOperationException(); }
这样就导致我们在把它当做java.util.ArrayList对象使用时调用方法add和remove会抛出 UnsupportedOperationException
解决方法:
1. 不使用Arrays.asList方法,直接new java.util.ArrayList(),然后依次添加对象(可能代码较多)。
2. 依然使用Arrays.asList方法,但是要加转换,代码如下:
tMap.put(name, new ArrayList(Arrays.asList(new CronTrigger[] { trigger })));