Java中Iterator.next()的并发异常[重复]

Posted

技术标签:

【中文标题】Java中Iterator.next()的并发异常[重复]【英文标题】:Concurrent Exception on Iterator.next() in Java [duplicate] 【发布时间】:2021-03-27 06:18:42 【问题描述】:

这是一个代码 sn-p 移动到链表中的下一个元素。在调试时,itrPlaylist.next() 正在触发 ConcurrentModificationException。我读到在迭代时不应修改列表。那么,在这种情况下,我哪里做错了?怎么解决?

提前致谢。

public boolean nexxt() 
    if(this.itrPlaylist.hasNext())
    
        if(!bForward)
        
            bForward = true;
            itrPlaylist.next();
        
        System.out.println("Now playing : " + itrPlaylist.next());
        return true;    
    
    else
    
        System.out.println("Reached end of " + this.getPlaylistName() + " playlist !");
    
    return false;

【问题讨论】:

首先要调用 next() 两次 【参考方案1】:

itrPlaylist 是在哪里定义的?有点像

itrPlaylist = list.iterator();

上面的赋值应该在所有插入到列表中之后发生。看起来您已经为 itrPlaylist 创建了一个实例变量。我想你可能会这样做

list.add(value); 

在 itrPlaylist 初始化之后。

在这种情况下,代码将抛出上述异常。当迭代器已经初始化时,当迭代器之外的一些其他代码修改列表时,就会发生这种情况。

【讨论】:

谢谢@aatwork。你说的对。错误是我什至在填充列表之前就初始化了迭代器。

以上是关于Java中Iterator.next()的并发异常[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Java线程同步类容器和并发容器

java iterator hasnext() 死循环

阅读阿里巴巴开发人员手册1

java提高篇(三十)-----Iterator

之后是Java Set Iterator#remove()还是Set#clear()?

Java自用Java集合-Iterator迭代器接口(为容器而生)