Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java LinkedList ConcurrentModificationException_Java_Linked List_Iterator - Fatal编程技术网

Java LinkedList ConcurrentModificationException

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编写了一个简单的代码,向其中添加数据并对其进行迭代,
我导入了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中首次使用迭代器时,它会检测到并发更改。正确,很好。迭代器创建得太早,然后将项添加到集合中,从而使迭代器无效。当您使用不再有效的迭代器时引发异常。