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