Java LinkedList ConcurrentModificationException

时间:2016-08-17 06:40:27

标签: java linked-list iterator

我为LinkedList编写了一个简单的代码,将数据添加到其中并迭代它,
我导入了LinkedList和Iterator所需的包, 代码中没有错误,

我收到以下例外情况 -

_('product_delete_error_no_owner_found')

这是我的代码 -

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)

3 个答案:

答案 0 :(得分:4)

您应该在显示方法中获得iterator,例如:

void displayList(){
    itr = al.iterator();
    while(itr.hasNext()){  
           System.out.println(itr.next());  
    }
}

对于LinkedList有一个字段modCount,此字段用于记录此列表已被修改的次数。

  

此列表结构修改的次数。     结构修改是那些改变大小的结构     列表,或以其他方式扰乱它,以便迭代     进展可能会产生不正确的结果。

首次创建iterator时,modCount0ListItr已录制expectedModCount=modCount=0,修改后列表即可。 modCount已更新,例如 4

当迭代器时,它将比较迭代器的expectedModCount列表 modCount,如果不相等,则ConcurrentModifyExpection抛出。

答案 1 :(得分:2)

从列表中获取迭代器后,无法在列表中添加或删除元素。 以下代码应该可以工作。

void displayList(){
    Iterator<String> itr = al.iterator();
    while(itr.hasNext()){  
           System.out.println(itr.next());  
    }
}

如需进一步阅读,请参阅以下链接:

Iterating through a Collection, avoiding ConcurrentModificationException when removing in loop

http://javahungry.blogspot.com/2014/04/fail-fast-iterator-vs-fail-safe-iterator-difference-with-example-in-java.html

答案 2 :(得分:2)

首先你得到

 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");  
...  

但这不是您想要的,因为hasNext()上的itr将返回false