在通过arraylist循环时获取java.util.concurrentmodificationexception

9q78igpj  于 2021-08-20  发布在  Java
关注(0)|答案(3)|浏览(634)

我正在使用spring boot作为后端开发一个应用程序。在循环并更新数组列表中对象的值时抛出以下错误,

java.util.ConcurrentModificationException: null
        at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:911) ~[na:1.8.0_292]
        at java.util.ArrayList$Itr.next(ArrayList.java:861) ~[na:1.8.0_292]
        at org.hibernate.collection.internal.AbstractPersistentCollection$IteratorProxy.next(AbstractPersistentCollection.java:883) ~[hibernate-core-5.4.12.Final.jar!/:5.4.12.Final]

我改变了循环,如下所示,

for(Object obj : myObjectList) {
   obj.setEndDate(someDate);
   obj.isActive(false);
   objectRepository.save(obj);
}

Iterator<Object> objIterator = myObjectList.iterator();
   while(objIterator.hasNext()) {
      Object obj = objIterator.next();
      obj.setEndDate(someDate);
      obj.isActive(false);
      objectRepository.save(obj);
   }

两者都抛出了相同的错误。
将日志打印到这些for循环中时。它将第一次打印日志,并在第二次迭代时抛出错误。

dddzy1tm

dddzy1tm1#

如果您想在对列表进行迭代时修改列表,那么切换到使用迭代器是正确的选择,但是您需要一个while循环而不是for循环:

List<Object> myObjectList = new ArrayList<>();
    Iterator<Object> objIterator = myObjectList.iterator();
    while (objIterator.hasNext()) {
        Object obj = objIterator.next();
        obj.setEndDate(someDate);
        obj.isActive(false);
        objectRepository.save(obj);
    }
x4shl7ld

x4shl7ld2#

您可以通过如下方式创建新的arraylist Package 器来使用故障安全交互:

for(Object obj : new ArrayList<>(myObjectList)) {
   obj.setEndDate(someDate);
   obj.isActive(false);
   objectRepository.save(obj);
}

这会解决你的问题

l2osamch

l2osamch3#

作为对其他答案的补充,您可以先修改集合,然后保存它。

myObjectList.forEach(obj -> {
        obj.setEndDate(someDate);
        obj.isActive(false);
    });
    objectRepository.save(myObjectList); //Depending of your version, this method could be saveAll();

相关问题