1、不支持的操作异常
UnsupportedOperationException
通用在创建集合的时候,创建完集合继续往集合里添加元素
List<Integer> integers = Arrays.asList(2, 3, 4, 5);
integers.add(1);
System.out.println(integers);
这种通过Arrays.asList()方法,创建集合的时候,可以看到源码调用的是
return new ArrayList<>(a);。注意这个ArrayList不是new ArrayList()那个类,而是Arrays类里的私有静态内部类。
private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable
这个类的全路径名是:
java.util.Arrays.ArrayList
而new ArrayList()那个类的全路径名是:
java.util.ArrayList
继续说这个内部类,它继承了AbstractList<E>,这个类不支持添加和删除、替换指定位置的元素的操作。
public void add(int index, E element) { throw new UnsupportedOperationException(); }
public E remove(int index) { throw new UnsupportedOperationException(); }
public E set(int index, E element) { throw new UnsupportedOperationException(); }
改进:使用new ArrList()的构造方法,将Arrays.asList()方法创建的集合传入。
2、并发修改异常
ConcurrentModificationException
在增强for循环中发生的,业务场景:在增强for循环中,排序
Person person1 = new Person("德玛",19); Person person2 = new Person("索拉卡",16); Person person3 = new Person("妖姬",17); List<Person> list = new ArrayList<>(); list.add(person1); list.add(person2); list.add(person3); System.out.println(list); 这样是正常的 for (int i = 0; i < list.size(); i++) { list.sort(Comparator.comparing(Person::getAge)); } 增强for循环的时候就会报引发修改异常的错误 for (Person person : list) { list.sort(Comparator.comparing(Person::getAge)); }
通过list获取到迭代器的时候,迭代器对象会初始化一个expectedModCount 变量,这个变量值等于list中的modCount值。
直接通过list对象排序,modCount值就会发生相应的改变。
但是expectedModCount值不会改变。
再次使用迭代器获取下一个元素的时候
next()方法会调用checkForComodification方法
这时候,expectedModCount 还是原来的值,
但是modCount已经发生了改变
if (modCount != expectedModCount)成立
ConcurrentModificationException便会抛出
改进:避免在增强for循环中操作集合元素,可以使用普通for循环,或者通过迭代器的方式去操作集合