为什么在创建迭代器对象后无法在 java 中向我的 ArrayList 添加值



我正在学习Java中的集合类。我创建了一个 ArrayList 并向其添加了一些值。

package LearningJava;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.Scanner;
public class Java{
public static void  main(String args[]) {
Collection values = new ArrayList();
values.add(2);
values.add(3);
values.add(5);
values.add(4);
Iterator itr = values.iterator();
for(int i = 0 ; i<values.size();i++) {
System.out.println(itr.next());
}
}
}

我还遍历了这个 ArrayList。

如果我在创建后添加值,迭代器的对象会抛出异常。

package LearningJava;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.Scanner;
public class Java{
public static void  main(String args[]) {
Collection values = new ArrayList();
values.add(2);
values.add(3);
values.add(5);

Iterator itr = values.iterator();
values.add(4);

for(int i = 0 ; i<values.size();i++) {
System.out.println(itr.next());
}
}
} 

它抛出了一个java.util.ConcurrentModificationException.为什么创建迭代器对象后不能添加值?

它仅在迭代器接口的情况下引发此异常。当我创建其他类的对象时,它不会引发任何异常。

package LearningJava;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.Scanner;
public class Java{
public static void  main(String args[]) {
Collection values = new ArrayList();
values.add(2);
values.add(3);
values.add(5);

// creating the object of scanner instead of iterator's.
Scanner input  = new Scanner(System.in);
values.add(4);
Iterator itr = values.iterator();
for(int i = 0 ; i<values.size();i++) {
System.out.println(itr.next());
}
}
}

在这里它没有显示任何错误。这是为什么呢?

这种行为记录在ArrayList的文档中:

此类的iteratorlistIterator方法返回的迭代器是快速失败的:如果在创建迭代器后的任何时间对列表进行结构修改,则除了通过迭代器自己的removeadd方法之外,迭代器将抛出ConcurrentModificationException

添加元素算作"在结构上"修改列表,并注意"创建迭代器后"的措辞。

当您开始使用next迭代列表时,会检测到修改,这是引发异常的位置。

另请参阅为什么抛出 ConcurrentModificationException 以及如何调试它,了解有关什么是ConcurrentModificationException的详细信息,尽管该问题并未专门解决在创建迭代器后立即修改集合而不调用next的情况。

最新更新