Java LinkedList ConcurrentModificationException
我为LinkedList编写了一个简单的代码,向其中添加数据并对其进行迭代,Java LinkedList ConcurrentModificationException,java,linked-list,iterator,Java,Linked List,Iterator,我为LinkedList编写了一个简单的代码,向其中添加数据并对其进行迭代, 我导入了LinkedList和Iterator所需的包, 代码中没有错误, 我收到以下异常- Exception in thread "main" java.util.ConcurrentModificationException at java.util.LinkedList$ListItr.checkForComodification(Unknown Source) at java.util.Lin
我导入了LinkedList和Iterator所需的包, 代码中没有错误,
我收到以下异常-
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.LinkedList$ListItr.checkForComodification(Unknown Source)
at java.util.LinkedList$ListItr.next(Unknown Source)
at collectionFramework.Demo.displayList(LinkedListDemo.java:38)
at collectionFramework.LinkedListDemo.main(LinkedListDemo.java:13)
这是我的代码-
package collectionFramework;
import java.util.Iterator;
import java.util.LinkedList;
public class LinkedListDemo{
public static void main(String[] args) {
Demo obj = new Demo();
obj.addToList();
obj.displayList();
}
}
class Demo{
LinkedList<String> al;
Iterator<String> itr;
Demo(){
al = new LinkedList<String>();
itr = al.iterator();
}
void addToList(){
al.add("Aniruddha");
al.add("Hitesh");
al.add("Rahul");
al.add("Kshitij");
}
void displayList(){
while(itr.hasNext()){
System.out.println(itr.next());
}
}
}
packagecollectionframework;
导入java.util.Iterator;
导入java.util.LinkedList;
公共类LinkedListDemo{
公共静态void main(字符串[]args){
Demo obj=新的Demo();
对象addToList();
obj.displayList();
}
}
课堂演示{
LinkedList al;
迭代器itr;
演示(){
al=新链接列表();
itr=al.iterator();
}
void addToList(){
添加(“Aniruddha”);
al.添加(“Hitesh”);
al.添加(“Rahul”);
al.添加(“Kshitij”);
}
void displayList(){
而(itr.hasNext()){
System.out.println(itr.next());
}
}
}
您应该在显示方法中获得迭代器,如:
void displayList(){
itr = al.iterator();
while(itr.hasNext()){
System.out.println(itr.next());
}
}
对于LinkedList
有一个字段modCount
,此字段用于记录此列表被构造和修改的次数
此列表在结构上被修改的次数。
结构修改是指改变结构尺寸的修改
列表,或者以某种方式对其进行扰动,使迭代
进步可能会产生错误的结果
当您第一次创建迭代器时,modCount
是0
,因为在您修改列表后,ListItr
已经记录了expectedModCount=modCount=0
。modCount
已经更新,因为您的示例是4
当使用迭代器时,它将比较迭代器的
expectedModCount
和列表modCount
,如果不相等,则抛出ConcurrentModifyExpection
。一旦从列表中获得迭代器,就不能从列表中添加或删除元素。
下面的代码应该可以工作
void displayList(){
Iterator<String> itr = al.iterator();
while(itr.hasNext()){
System.out.println(itr.next());
}
}
void displayList(){
迭代器itr=al.Iterator();
而(itr.hasNext()){
System.out.println(itr.next());
}
}
欲了解更多信息,请参阅以下链接:
首先,你得到
itr = al.iterator();
然后将一些元素添加到列表中
al.add("Aniruddha");
al.add("Hitesh");
al.add("Rahul");
al.add("Kshitij");
这使得迭代器过时了
您应该在显示列表之前获得新的迭代器
void displayList(){
itr = al.iterator();
while(itr.hasNext()){
System.out.println(itr.next());
}
}
或通过迭代器添加元素:
itr.add("Aniruddha");
itr.add("Hitesh");
...
但这不是您想要的,因为
itr
上的hasNext()
将返回false,因为。。。在构造函数中创建了迭代器之后,会调用addList,同时更改列表,并且在displayList中首次使用迭代器时,它会检测到并发更改。正确,很好。迭代器创建得太早,然后将项添加到集合中,从而使迭代器无效。当您使用不再有效的迭代器时引发异常。