ConcurrentModificationException即使更改foreach之外的值

时间:2014-04-30 13:32:36

标签: java exception concurrentmodification

我有以下代码

                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();
                }

即使我在完成foreach循环后设置ConcurrentModificationException,编译器也会给出epsilonStanje=epsilonSljedecaStanja。我尝试过debuggng,但似乎无法解决这个问题。 我正在制作的程序是单线程的

编辑:

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)

2 个答案:

答案 0 :(得分:2)

epsilonStanjaepsilonStanja都指向同一个对象,如下所示。

            epsilonStanja = sljedecaStanja;

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

您无法在迭代时添加数据。

解决方案:创建一个单独的列表,最后根据您的要求合并它或尝试下面的代码:

epsilonStanja.addAll(sljedecaStanja);

答案 1 :(得分:1)

您将列表sljedecaStanja的引用分配给epsilonStanja。这是问题..试试

epsilonStanja = new ArrayList<String>(sljedecaStanja);