Java ConcurrentModificationException
exception, java
Solution
I'm seeing the same thing,
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Launcher
{
public static void main(String[] args)
{
doThis();
doThat();
}
private static void doThis()
{
System.out.println("dothis");
try
{
List<String> myList1 = new ArrayList<String>();
Collections.addAll(myList1, "str1","str2","str3","str4","str5");
for(String element : myList1){//no ConcurrentModificationException here
if(element.equalsIgnoreCase("str4"))
myList1.remove("str4");
}
System.out.println(myList1);
}
catch(Exception e)
{
e.printStackTrace();
}
}
private static void doThat()
{
System.out.println("dothat");
try
{
List<String> myList2 = new ArrayList<String>();
Collections.addAll(myList2, "str1","str2","str3","str4","str5");
for(String element : myList2){//ConcurrentModificationException here
if(element.equalsIgnoreCase("str1"))
myList2.remove("str1");
}
System.out.println(myList2);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
which outputs,
dothis
[str1, str2, str3, str5]
dothat
java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(Unknown Source)
at java.util.AbstractList$Itr.next(Unknown Source)
at com.foo.Launcher.doThat(Launcher.java:41)
at com.foo.Launcher.main(Launcher.java:12)
And I've found the reason.
Problem
when remove the second last element there is no ConcurrentModificationException ``` List<String> myList1 = new ArrayList<String>(); Collections.addAll(myList1, "str1","str2","str3","str4","str5"); for(String element : myList1){//no ConcurrentModificationException here if(element.equalsIgnoreCase("str4")) myList1.remove("str4"); } System.out.println(myList1); ``` But when remove other elements there is a ConcurrentModificationException ``` List<String> myList2 = new ArrayList<String>(); Collections.addAll(myList2, "str1","str2","str3","str4","str5"); for(String element : myList2){//ConcurrentModificationException here if(element.equalsIgnoreCase("str1")) myList2.remove("str1"); } System.out.println(myList2); ``` what is the reason?
Related problems
- Why isn't this code causing a ConcurrentModificationException?
- How can I iterate over an object while modifying it in Java?
- Why is a ConcurrentModificationException thrown and how to debug it
- Why isn't this code causing a ConcurrentModificationException?
- How can I iterate over an object while modifying it in Java?