突变对象时发生java.util.ConcurrentModificationException

问题描述

我正在遍历CustomObject的列表,并且在进行此迭代时,我通过向该自定义对象的标签列表中添加标签来对该对象进行变异。我没有在customObjects(列表)之间添加删除任何CustomObject。我仍然收到java.util.ConcurrentModifcationException。

public class CustomObject {
    private List<Tag> tags;
    // Getter for Tag
    // Setter for tag
}

public class DummyClass {


  List<CustomObject> addMissingTag(List<CustomObject> customObjects) {
    for (CustomObject object:customObjects) { // line 5
      // following method adds a tag to tags list of CustomObject
      mutateObjectByAddingField(object); // line 7
      // Some Code      
    }
    return customObjects;
  }

  void mutateObjectByAddingField(CustomObject customObject) {//line 13
    Boolean found = false;
    for (Tag tag:customObject.getTags()) { // line 15
      if ("DummyKey".equalsIgnoreCase(tag.getKey())) {
        found = true;
        break;
      }
    }
    if (!found) {
      Tag tag = new Tag("DummyKey","false");
      List<Tag> tags = customObject.getTags();
      tags.add(tag);
      customObject.setTags(tags);
    }
  }

}

这是堆栈跟踪:

java.util.ConcurrentModificationException: null
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901) ~[?:1.8.0_131]
    at java.util.ArrayList$Itr.next(ArrayList.java:851) ~[?:1.8.0_131]
    at DummyClass.mutateObjectByAddingField(DummyClass.java:15)
    at DummyClass.addMissingTag(DummyClass.java:7)

这是否意味着即使我们只是尝试修改对象并且不从列表/集合中删除/添加/添加对象,我们也可以获得ConcurrentModifcationException吗?

解决方法

首先,您在List循环中使用for类型来迭代元素,因此,增强的for语句等效于使用迭代器的for,如here所述,因为List实现了Iterator。另外,从堆栈跟踪中可以明显看出。

使用Iterator时,您无法在要迭代的列表上进行修改,如GeeksForGeeks所述,您将得到ConcurrentModificationException

因此,要解决此问题,您可以例如使用如下整数明确实现for循环:

 for (int i=0;i < customObjects.length(); i++) {

      CustomObject object = customObjects.get(i);

      // following method adds a tag to tags list of CustomObject
      mutateObjectByAddingField(object);
      // Some Code      
 }

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...