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

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

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

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

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

  1. for(Object obj : myObjectList) {
  2. obj.setEndDate(someDate);
  3. obj.isActive(false);
  4. objectRepository.save(obj);
  5. }

  1. Iterator<Object> objIterator = myObjectList.iterator();
  2. while(objIterator.hasNext()) {
  3. Object obj = objIterator.next();
  4. obj.setEndDate(someDate);
  5. obj.isActive(false);
  6. objectRepository.save(obj);
  7. }

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

dddzy1tm

dddzy1tm1#

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

  1. List<Object> myObjectList = new ArrayList<>();
  2. Iterator<Object> objIterator = myObjectList.iterator();
  3. while (objIterator.hasNext()) {
  4. Object obj = objIterator.next();
  5. obj.setEndDate(someDate);
  6. obj.isActive(false);
  7. objectRepository.save(obj);
  8. }
x4shl7ld

x4shl7ld2#

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

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

这会解决你的问题

l2osamch

l2osamch3#

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

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

相关问题