标签:
程序中某段案例代码如下:
Map<String, List<CronTrigger>> tMap = new HashMap<String, List<CronTrigger>>(); tMap.put(name, Arrays.asList(new CronTrigger[] { trigger }));
程序运行抛出异常:java.lang.UnsupportedOperationException
错误原因:
为了快速创建List而使用了Arrays.asList方法,但此方法返回的ArrayList不是java.util.ArrayList对象,而是Arrays的一个内部类。
我们可以看下源码
Arrays.class: @SafeVarargs public static <T> List<T> asList(T... a) { return new ArrayList<>(a); } --------------------------------------------------- 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) { 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<CronTrigger>(Arrays.asList(new CronTrigger[] { trigger })));
标签:
原文地址:http://www.cnblogs.com/bye-hero/p/4614252.html