Trying to modify a HashMap directly while iterating over it

java.util.ConcurrentModificationException
Javadoc
This exception may be thrown by methods that have detected concurrent modification of an object when such modification is not permissible.

For example, it is not generally permissible for one thread to modify a Collection while another thread is iterating over it. In general, the results of the iteration are undefined under these circumstances. Some Iterator implementations (including those of all the general purpose collection implementations provided by the JRE) may choose to throw this exception if this behavior is detected. Iterators that do this are known as fail-fast iterators, as they fail quickly and cleanly, rather that risking arbitrary, non-deterministic behavior at an undetermined time in the future.

Note that this exception does not always indicate that an object has been concurrently modified by a different thread. If a single thread issues a sequence of method invocations that violates the contract of an object, the object may throw this exception. For example, if a thread modifies a collection directly while it is iterating over the collection with a fail-fast iterator, the iterator will throw this exception.

Note that fail-fast behavior cannot be guaranteed as it is, generally speaking, impossible to make any hard guarantees in the presence of unsynchronized concurrent modification. Fail-fast operations throw {@code ConcurrentModificationException} on a best-effort basis. Therefore, it would be wrong to write a program that depended on this exception for its correctness: {@code ConcurrentModificationException} should be used only to detect bugs. @author Josh Bloch @see Collection @see Iterator @see Spliterator @see ListIterator @see Vector @see LinkedList @see HashSet @see Hashtable @see TreeMap @see AbstractList @since 1.2

at java.util.HashMap$HashIterator.nextEntry
(source)

Typical Exception Messages

  1. <No message>
  2. null
  3. java.util.ConcurrentModificationException
  4. Failed to execute runnable (java.util.ConcurrentModificationException)
  5. Error creating bean with name 'template': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'camelContext': Invocation of init method failed; nested exception is java.util.ConcurrentModificationException
  6. Failed to serialize element due to ConcurrentModificationException. This is frequently the result of inappropriately sharing thread unsafe object (eg. ArrayList, HashMap, etc) between threads
  7. Ticking player
  8. Ticking tile entity
  9. Plugin OpenAnalytics v1.0.03 generated an exception while executing task 28
  10. There was an error while bundling.

Specific cases

Solution

rahsan, 2 months ago

This kind of exception is thrown when you are trying to modify a HashMap directly (without using it's iterator) while iterating over it. To solve this problem, do one of the following:

  • Use a ConcurrentHashMap
  • Add - To add an entry while iterating, create a new HashMap, add all entries to this map. Once complete use HashMap.putAll() method to add all new entries to the original HashMap.
  • Remove - To remove an entry, use it's iterator's remove method. For more details check this answer

External results for this pattern (971)

  1. Owen Tranvia Google Groups2 weeks ago
  2. Unknown authorvia Google Groups2 weeks ago
    No message found for this stack trace.
    Show stack trace
  3. Ceki Gülcüvia QOS.ch JIRA2 weeks ago
    Unexpected initialization failure
    Show stack trace
  4. MJsayconvia GitHub4 weeks ago
    No message found for this stack trace.
    Show stack trace
  5. NmdOfficialvia GitHub2 months ago
    No message found for this stack trace.
    Show stack trace
  6. nicolas-raoulvia GitHub2 months ago
    No message found for this stack trace.
    Show stack trace
  7. nicolas-raoulvia GitHub2 months ago
    No message found for this stack trace.
    Show stack trace
  8. RubenMattanvia GitHub2 months ago
    No message found for this stack trace.
    Show stack trace