ConcurrentModificationException while using Iterator in Java

21 Apr, 2021
ConcurrentModificationException has thrown by methods that have detected concurrent modification of an object when such modification is not permissible. If a thread modifies a collection directly while it is iterating over the collection with a fail-fast iterator, the iterator will throw this ConcurrentModificationException. Here we will be understanding this exception with an example of why it occurs and how changes are made simultaneously which is the root cause for this exception. In the later part, we will understand how to fix it up.
Example 1: ConcurrentModificationException
Java
// Java Program to ConcurrentModificationException while// using Iterator  // Importing ArrayList and Iterator classes from java.util// packageimport java.util.ArrayList;import java.util.Iterator;  // Main classpublic class GFG {      // Main driver method    public static void main(String[] args)    {        // Creating an object of ArrayList class        // Declaring object of Integer type        ArrayList<Integer> list = new ArrayList<>();          // Adding custom integer elements to the object        list.add(1);        list.add(2);        list.add(3);        list.add(4);        list.add(5);          // Iterating over object elements using iterator        Iterator<Integer> iterator = list.iterator();          // Condition check        // It holds true till there is single element        // remainin in the List        while (iterator.hasNext()) {              // Rolling over to next element using next()            // method            Integer value = iterator.next();              // Print the element value            System.out.println("value: " + value);              // If element equals certain value            if (value.equals(2)) {                  // Display command for better readability                System.out.println(                    "========================");                  // Removing entered value in object                System.out.println("removing value: "                                   + value);                  // Making changes simultaneously                System.out.println(                    "========================");                list.remove(value);            }        }    }}
Output:
Output Explanation:
ConcurrentModificationException is thrown when the next() method is called as the iterator is iterating the List, and we are making modifications in it simultaneously. Now in order to avoid this exception so let us do discuss a way out of using iterator directly which is as follows:
Example 2: Resolving ConcurrentModificationException
Java
// Java Program to Avoid ConcurrentModificationException by// directly using Iterator  // Importing ArrayList and Iterator classes// from java.util packageimport java.util.ArrayList;import java.util.Iterator;  // Main classpublic class Main {      // Mai driver method    public static void main(String[] args)    {        // Creating an ArrayList object of integer type        ArrayList<Integer> list = new ArrayList<>();          // Custom integer elements are added        list.add(1);        list.add(2);        list.add(3);        list.add(4);        list.add(5);          // Iterating directly over elements of object        Iterator<Integer> iterator = list.iterator();          // Condition check        // It holds true till there is single element        // remaining in the List using hasNext() method        while (iterator.hasNext()) {              // Rolling over elements using next() method            Integer value = iterator.next();              // print the values            System.out.println("value: " + value);              // If value equals certain integer element            // entered Say it be 2            if (value.equals(2)) {                  // Display command only                System.out.println(                    "========================");                  // Removing the entered value                 System.out.println("removing value: "                                   + value);                                 // Display command only                System.out.println(                    "========================");                                // Removing current value in Collection                // using remove() method                 iterator.remove();            }        }    }}
Output:
Output Explanation:
ConcurrentModificationException is not thrown because the remove() method does not cause a ConcurrentModificationException. 
Java-Exceptions
Picked
Java
Java
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Stream In Java
Introduction to Java
Constructors in Java
Exceptions in Java
Generics in Java
Functional Interfaces in Java
Java Programming Examples
Strings in Java
Differences between JDK, JRE and JVM
Abstraction in Java