当前位置: 首页 > 知识库问答 >
问题:

对于java列表并发修改异常,如果在迭代前调用remove方法[重复]

郁承运
2023-03-14
    public static void main(String[] args)
    {
        List<String> l1 = new ArrayList<>();
        l1.add("v1");
        Iterator<String> it =  l1.iterator();
        l1.remove(0);
        while(it.hasNext()) {
            System.out.println(it.next());
        }
    }

而此代码引发ConcurrentModificationException

    public static void main(String[] args)
    {
        List<String> l1 = new ArrayList<>();
        l1.add("v1");
        Iterator<String> it =  l1.iterator();
        l1.add("v2");
        while(it.hasNext()) {
            System.out.println(it.next());
        }
    }

这两种操作都是对列表的结构修改,但为什么只有在加法的情况下才抛出异常?

共有1个答案

贝德辉
2023-03-14

查看arraylist.itr

有两个计数器:arraylist.modcountarraylist.itr.expectedmodcountArraylist.itrmodcount!=expectedmodcount时抛出ConcurrentModificationException

这是正确的。但是如果查看arraylist.itr.hasnext,可以看到:

public boolean hasNext() {
    return cursor != size;
}
public static void main(String[] args)
{
    List<String> l1 = new ArrayList<>();
    l1.add("v1");
    l1.add("v2");
    Iterator<String> it =  l1.iterator();
    l1.remove(0);
    while(it.hasNext()) {
        System.out.println(it.next());  // --> ConcurrentModificationException
    }
}
 类似资料:
  • 当我使用temp=iterator.next()时,sort方法会导致并发修改错误。你能帮我解决并发修改错误吗。我给出了整个类的代码,但我只是尝试完成sort方法。事先谢谢你的帮助。 我必须对ArrayList中的所有数组进行排序。

  • 我对java相当陌生,实际上我正在编写一个键盘记录器,并让它定期写入文件。每当用户按下某个键时,它都会实例化一个NativeKeyEvent,该事件调用“param string()”并将信息作为字符串添加到下面的arraylist中... 然后,在每一个间隔,字符串数组被传递,并被写入下面的TimerTask线程中的文件。 行'str=iterator.next().tostring();‘然后

  • 问题内容: 我有这段代码,它给了我并发修改异常。即使看不到任何并发修改,我也无法理解为什么继续得到它。 问题答案: 为了避免,你应该这样编写代码: 允许你在迭代期间修改列表,但不能在创建和使用列表之间进行修改。

  • 问题内容: 您能否告诉我在单线程环境中是否有可能发生并发修改异常的方法,我下面发布的以下应用程序由两个线程组成,请告诉我我也可以在单个线程中看到相同的异常..请劝告 是的,我知道,在单线程环境中,此错误可能会出现..如下面的代码所示。 请告知解决该问题的方法是什么..这样就不会出现此错误.. !! 问题答案: 可以在单线程环境中引发A。只要在不应该​​在上下文中修改对象的情况下使用它,就不必在另一

  • 另一方面,如果我们这样写,就没有并发修改异常!注意,代码完全相同,除了用于比较的字符串,在第一个示例中是代码,在第二个示例中是Java 我使用的是Netbeans 8.2,Windows 7 32bit,JDK 1.8.0_131有什么问题吗?

  • 问题内容: 我知道您不应在遍历列表时添加/删除项目。但是,如果不更改列表长度,是否可以修改要迭代的列表中的项目? 还是应该迭代列表索引?像那样: 问题是:以上两种方式都是允许的,还是只有第二种是没有错误的? 如果答案是肯定的,以下代码段是否有效? UPD。我想在python文档中看到“允许这些操作”而不是某人的假设。 问题答案: 可以这么说,您 不是在 修改列表。您只是在修改列表中的元素。我不认为