Search code examples
javaexceptionconcurrentmodification

ConcurrentModificationException even though changing values outside of foreach


I have the following code

                boolean postojaoJePrijelaz = true;
                epsilonStanja = sljedecaStanja;
                while(postojaoJePrijelaz) {
                    for (String epsilonStanje : epsilonStanja) {
                        for (Prijelaz trenutniPrijelaz : prijelazi) {
                            postojaoJePrijelaz = false;
                            if (trenutniPrijelaz.postojiPrijelaz(epsilonStanje.trim(), "$")) {
                                sljedecaStanja.addAll(trenutniPrijelaz.getSkupIzlaznihStanja());
                                epsilonSljedecaStanja.addAll(trenutniPrijelaz.getSkupIzlaznihStanja());
                                postojaoJePrijelaz = true;
                            }
                        }
                    }
                    epsilonStanja = epsilonSljedecaStanja;
                    epsilonSljedecaStanja.clear();
                }

And the compiler gives e ConcurrentModificationException even though i set epsilonStanje=epsilonSljedecaStanja after I already finished my foreach loop. I tried debuggng, but can't seem to fix this. The program that I'm making is single-threaded

EDIT:

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
    at java.util.ArrayList$Itr.next(ArrayList.java:831)
    at com.company.Main.main(Main.java:55)

Solution

  • epsilonStanja and epsilonStanja both are pointing to the same object as shown below.

                epsilonStanja = sljedecaStanja;
    
                for (String epsilonStanje : epsilonStanja) {
                    ...
                    sljedecaStanja.addAll(trenutniPrijelaz.getSkupIzlaznihStanja());
                    ...
                }
    

    you can't add data while iterating.

    Solution: create a separate list and finally merge it as per your requirement or try below code:

    epsilonStanja.addAll(sljedecaStanja);