程序中某段案例代码如下:
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:
@SafeVarargspublic static ListasList(T... a) {return new ArrayList<>(a);
}---------------------------------------------------
private static class ArrayList extends AbstractListimplementsRandomAccess, java.io.Serializable
{private static final long serialVersionUID = -2764017481108945198L;private finalE[] a;
ArrayList(E[] array) {if (array==null)throw newNullPointerException();
a=array;
}
.....
上述代码中可以看出内部类ArrayList继承了AbstractList,但是没有重写其add方法和remove方法,AbstractList中相关代码如下:
public booleanadd(E e) {
add(size(), e);return true;
}public void add(intindex, E element) {throw newUnsupportedOperationException();
}public E remove(intindex) {throw newUnsupportedOperationException();
}
这样就导致我们在把它当做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 })));