在ArrayList中循环时获取java.util.ConcurrentModificationException



我正在使用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);
}

两者都抛出了相同的错误。

将日志打印到这些循环中时。它将第一次打印日志,并在第二次迭代中抛出错误。

如果您想在迭代列表的同时修改列表,切换到使用迭代器是正确的调用,但是您需要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);
}

您可以通过创建新的ArrayList包装器来使用故障安全交互,如下所示:

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

它将解决您的问题

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

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

相关内容

最新更新