什么网站可以做设计赚钱吗,网络服务合同范本免费,无锡通告最新,企业网站推广论述早上到公司#xff0c;刚到工位#xff0c;测试同事就跑来说功能不行了#xff0c;报服务器异常了#xff0c;咋回事;我一脸蒙#xff0c;早饭都顾不上吃#xff0c;要来了测试账号复现了一下#xff0c;然后仔细观察测试服务器日志#xff0c;发现报了一个… 早上到公司刚到工位测试同事就跑来说功能不行了报服务器异常了咋回事;我一脸蒙早饭都顾不上吃要来了测试账号复现了一下然后仔细观察测试服务器日志发现报了一个java.lang.UnsupportedOperationException异常  经排查发现是将一个枚举类中两个元素用Arrays.asList生成一个List集合并且将这个集合当作一个方法的参数传递在该方法中正好使用此List进行了add方法的操作导致异常发生了 Arrays.asList 
使用此方式生成的List集合为什么不能执行add方法  先来看下源码 SafeVarargsSuppressWarnings(varargs)public static T ListT asList(T... a) {return new ArrayList(a);  // ArrayList 是静态内部类}/*** serial include*/
private static class ArrayListE extends AbstractListEimplements RandomAccess, java.io.Serializable
{private static final long serialVersionUID  -2764017481108945198L;private final E[] a;  //被final修饰不可变ArrayList(E[] array) {a  Objects.requireNonNull(array);}Overridepublic int size() {return a.length;}
.......... 省略可自行去看源码....
}从源码可见Arrays.asList 实际上也是new了一个 ArrayList但是此处的ArrayList是Arrays这个类中的静态内部类该内部类中的变量a 是被final修饰说明变量a是不可变的数据不可被修改 /*** {inheritDoc}** pThis implementation always throws an* {code UnsupportedOperationException}.** throws UnsupportedOperationException {inheritDoc}* throws ClassCastException            {inheritDoc}* throws NullPointerException          {inheritDoc}* throws IllegalArgumentException      {inheritDoc}* throws IndexOutOfBoundsException     {inheritDoc}*/public void add(int index, E element) {throw new UnsupportedOperationException();}其次内部类ArrayList中并没有add的方法而是使用了继承类AbstractList中add方法该方法没有被重写所以直接就抛了UnsupportedOperationException异常正好对应上了 
直接使用new ListString list new ArrayList();list.add(王五);首先该ArrayList 是包java.util 下的类虽然也继承了抽象类AbstractList但是重写了抽象类AbstractList中的add方法 
/*** Appends the specified element to the end of this list.** param e element to be appended to this list* return tttrue/tt (as specified by {link Collection#add})*/public boolean add(E e) {ensureCapacityInternal(size  1);  // Increments modCount!!elementData[size]  e;return true;}正是因为重写了add方法所以才没有使用抽象类AbstractList中抛异常的add方法 
如何使用Arrays.asList创建的List可以正常执行add操作 
上面分析了原因因为Arrays中的静态内部类ArrayList未重写add方法如果执行的add方法是重写后的是否就可以解决? 可以将代码优化成下面的方式 
ListString list1  Arrays.asList(张三, 李四);
try {list1.add(王五); } catch (UnsupportedOperationException e) {System.out.println(oh, 报错了  e.toString());}//改良方式ListString list2  new ArrayList(Arrays.asList(张三, 李四));list2.add(王五);System.out.println(正常执行  list2);执行效果