我正在学习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
的文档中:
此类的
iterator
和listIterator
方法返回的迭代器是快速失败的:如果在创建迭代器后的任何时间对列表进行结构修改,则除了通过迭代器自己的remove
或add
方法之外,迭代器将抛出ConcurrentModificationException
。
添加元素算作"在结构上"修改列表,并注意"创建迭代器后"的措辞。
当您开始使用next
迭代列表时,会检测到修改,这是引发异常的位置。
另请参阅为什么抛出 ConcurrentModificationException 以及如何调试它,了解有关什么是ConcurrentModificationException
的详细信息,尽管该问题并未专门解决在创建迭代器后立即修改集合而不调用next
的情况。