java - Collection : ConcurrentModificationException

标签 java

为什么我在以下代码中收到此ConcurrentModificationException

public static ArrayList<ArrayList<String>> buildPath(String s, String e, HashMap<String, ArrayList<String>> visited) {
    ArrayList<ArrayList<String>> ret = new ArrayList<ArrayList<String>>();
    ArrayList<ArrayList<String>> temp = new ArrayList<ArrayList<String>>();
    ArrayList<String> tmp = new ArrayList<String>();
    tmp.add(e);
    ret.add(tmp);
    boolean needStop = false;
    while (true) {
        for (ArrayList<String> al : ret) { //concurrent exception
            ArrayList<String> pre_words = visited.get(al.get(al.size() - 1));
            for (String pre_word : pre_words) {
                if (pre_word.compareTo(s) == 0) {
                    needStop = true;
                }
                if (needStop && pre_word.compareTo(s) != 0) {
                    continue;
                }
                ArrayList<String> toadd = new ArrayList<String>(al);
                toadd.add(pre_word);
                temp.add(toadd);

            }
        }
        ret = temp;
        if (needStop) {
            for (ArrayList<String> l : ret) {
                Collections.reverse(l);
            }
            return ret;
        }
    }
}

如果我进行以下更改,程序将正确运行:

来自:

for(ArrayList<String> al : ret) {

至:

for(int i =0; i <ret.size() ; i++) {
    ArrayList<String> al = ret.get(i);

最佳答案

您在使用迭代器迭代列表的同时向列表添加元素。这就是导致此异常的原因。

非并发集合的迭代器是快速失败的:一旦它们注意到集合在迭代过程中被修改,它们就会抛出这样的异常。

关于java - Collection : ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18553556/

相关文章:

未设置 -Djava.ext.dirs 时未从目录加载 Java SPI JAR

java - 将剪辑路径信息添加到图像

java - 如何在另一个文件字符串中搜索并统计字符串 "CTG"?

java - 通过命令行或提示符在 Maven2 中为代理服务器传递密码?

java - Grails:用 Hibernate 类替换 GORM

java - 如何在 java 类中获取 TextView 值作为字符串并设置它?

java - 构造函数内的别名 - 类 Point

java - 安卓。使用 Java 测试 Wordpress 登录成功。

java - 为什么是<T extends Comparable>而不是<T Implements Comparable>?

java - 找不到lib处理