Why is a ConcurrentModificationException thrown and how to debug it
collections, concurrentmodification, exception, java
Solution
This is not a synchronization problem. This will occur if the underlying collection that is being iterated over is modified by anything other than the Iterator itself.
Iterator it = map.entrySet().iterator();
while (it.hasNext()) {
Entry item = it.next();
map.remove(item.getKey());
}
This will throw a `ConcurrentModificationException` when the `it.hasNext()` is called the second time.
The correct approach would be
Iterator it = map.entrySet().iterator();
while (it.hasNext()) {
Entry item = it.next();
it.remove();
}
Assuming this iterator supports the `remove()` operation.
Problem
I am using a `Collection` (a `HashMap` used indirectly by the JPA, it so happens), but apparently randomly the code throws a `ConcurrentModificationException`. What is causing it and how do I fix this problem? By using some synchronization, perhaps? Here is the full stack-trace: ``` Exception in thread "pool-1-thread-1" java.util.ConcurrentModificationException at java.util.HashMap$HashIterator.nextEntry(Unknown Source) at java.util.HashMap$ValueIterator.next(Unknown Source) at org.hibernate.collection.AbstractPersistentCollection$IteratorProxy.next(AbstractPersistentCollection.java:555) at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:296) at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:242) at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:219) at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169) at org.hibernate.engine.Cascade.cascade(Cascade.java:130) ```
Related problems
- Ways to iterate over a list in Java
- What is a stack trace, and how can I use it to debug my application errors?
- Iterating through a Collection, avoiding ConcurrentModificationException when removing objects in a loop
- Why doesn't this code throw a ConcurrentModificationException?
- ConcurrentModificationException in unmodifiable collection
- CopyOnWriteArrayList throwing CurrentModificationException
- ConcurrentModificationException with LinkedHashMap