与ArrayLists和HashMaps的ConcurrentModificationException

时间:2018-03-26 15:15:11

标签: java exception arraylist hashmap concurrentmodification

我一直在使用我一直在开发的数据库函数依赖算法。我正在尝试根据晶格的当前级别和列标题列表(不是真正相关的)来计算函数依赖性。

我试图遍历一个字符串标题列表,以及循环遍历每个字符串的字符。使用此推理,我然后使用这些值从地图中的List<String>值中删除字符串。 Map具有结构<String, List<String>>,我想简单地从HashMap的List<String>值中删除一个值。 colHeadsList<String>

当我开始遍历列表时,我收到ConcurrentModificationException:

for (String x: level) {
        for (char a : x.toCharArray()) {
            if (cPlusHash.get(x).contains(Character.toString(a))) {
                if (checkFD(Arrays.asList(x.replace("a", "")), Arrays.asList(Character.toString(a)))){
                    fds.add(x.replace("a", "") +", "+ a );  
                    cPlusHash.remove(x, Character.toString(a));



                    for (char j : x.toCharArray()) {
                        if (colHeads.contains(Character.toString(j))) {
                            colHeads.remove(Character.toString(j));
                        }
                    }
                    for (String b : colHeads) {
                        if (cPlusHash.get(x).contains(b)) {
                            cPlusHash.remove(x, b);
                        }
                    }
                }
            }
        }

我在这段代码的第一行抛出了错误。我很困惑,因为我实际上并没有尝试修改我正在迭代的List的值。

2 个答案:

答案 0 :(得分:0)

在大多数情况下,在循环浏览时无法修改列表或映射。解决方案是获取Iterator,它提供remove()方法。这允许Iterator了解变化并且不会“丢失它”。

答案 1 :(得分:0)

您正在尝试修改地图cPlusHash <String, List<String>>,同时您正在阅读不允许的内容,并导致ConcurrentModificationException

https://docs.oracle.com/javase/7/docs/api/java/util/ConcurrentModificationException.html

对于你的情况是一个单线程案例:

  

如果单个线程发出违反对象契约的一系列方法调用,则该对象可能会抛出此异常。例如,如果线程在使用失败快速迭代器迭代集合时直接修改集合,则迭代器将抛出此异常。