我在java中遇到“concurrentModificationException”,但我没有改变我正在迭代的列表

时间:2016-02-23 22:26:54

标签: java concurrentmodification

我有一个ArrayList<List<String>>,我正在尝试迭代并打印,但是,我不断获得ConcurrentModificationException

我的ArrayList<List<String>>表示文本行,其中每个内部列表是一本书的一行,并包含构成该行的字符串。我想逐行打印出来。这是导致错误的代码:

public void print(ArrayList<List<String>> book) {
    if (book == null) {
        return;
    }
    for (List<String> lst : book) {
        StringBuilder line = new StringBuilder();
        for (String s : lst) {
            line.append(s + " ");
        }

       // delete the extra space at the end
       line.deleteCharAt(line.length() - 1);
       // print out the line
       System.out.println(line.toString());
    }

    // print out an extra newline to get ready for next input
    System.out.println();
}

注意:此打印功能将书籍作为输入,这是另一个功能的输出。此其他功能仅用于解析文本文件并将单词放在ArrayList<List<String>>格式中。

2 个答案:

答案 0 :(得分:0)

在完成列表修改的同时迭代列表时,会引发并发修改异常。

上面你只是遍历列表,但同时别处有人改变了列表。

也许CopyOnWriteArrayList可能很有趣。但是根据您的代码,可以想象出几种解决方案。

答案 1 :(得分:-1)

这是您的错误:

你无法编辑for循环中的arraylist持有的引用

    String s =  line;
    // delete the extra space at the end
      s.deleteCharAt(s.length() - 1);

Line是来自你的lst的字符串,因为字符串是不可变的,所以更适合声明一个新的字符串