【问题标题】:ConcurrentModification while adding element into ArrayList将元素添加到 ArrayList 时的 ConcurrentModification
【发布时间】:2018-05-07 20:42:17
【问题描述】:

我是 Java 初学者,但我对一项任务有疑问。
我正在尝试向 ArrayList 添加一个元素,但有一个异常:Exception in thread "main" java.util.ConcurrentModificationException

    public Anagrams (String path) throws FileNotFoundException {
    List<String> tmpList = new ArrayList<>();

    Scanner scan = new Scanner(new File(path));
    while(scan.hasNext()) {
      tmpList.add(scan.next());
    }
    scan.close();

    tmpList.forEach(word -> {
        if(anList.isEmpty()) {
            ArrayList<String> tmp1 = new ArrayList<String>();
            tmp1.add(word);
            anList.add(tmp1);
        } 
        else {
            anList.forEach(list -> {
                if (isAnagram(word, list.get(0))) {
                    list.add(word);
                } else {
                    ArrayList<String> tmp2 = new ArrayList<String>();
                    tmp2.add(word);
                    anList.add(tmp2);
                }
            });
        }
    });

}

我正在从一个 txt 文件中收集单词并将它们分成不同的数组,无论它们是否是字谜。我知道在迭代集合时我无法修改集合 - 但我不知道如何避免此异常。请您帮帮我吗?

【问题讨论】:

标签: java arraylist iterator concurrentmodification


【解决方案1】:
anList.forEach(list -> {
            if (isAnagram(word, list.get(0))) {
                list.add(word);
            } else {
                ArrayList<String> tmp2 = new ArrayList<String>();
                tmp2.add(word);
                anList.add(tmp2); // !!
            }
        });

您认为forEach 调用会包括添加到anList 注释行上的元素吗?// !!

Java 不知道它是否应该这样做。所以它会抛出。

弄清楚如何做一些不同的事情:例如,添加到不同的列表中。

【讨论】:

  • 咳咳。这不是编译器错误(java 不需要“知道”任何东西),而是添加到正在迭代的列表中导致的运行时错误。
  • 我不确定我的回答是否暗示这是一个编译器错误。
猜你喜欢
  • 2021-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多