引起:java.util.ConcurrentModificationException

时间:2016-02-16 01:01:15

标签: java

我不明白为什么会这样。我正在对其他问题进行一些研究,我发现在使用for循环时你无法修改集合。但是,我正在使用迭代器,为什么它不起作用?

int counter = 0;
    int otherCounter = 0;
    ArrayList<Character> chars = new ArrayList<Character>();
    Iterator<Character> i = chars.iterator();
    for (char s : e.getMessage().toCharArray()) {
        chars.add(s);
    }
    while (i.hasNext()) {
        char s = i.next();
        if (chars.get(otherCounter + 1) == s) {
            counter++;
        } else {
            counter = 0;
        }
        if (counter >= 2) {
            i.remove();
        }
        otherCounter++;
    }

由于某些原因,我在这一行收到错误: char s = i.next();

2 个答案:

答案 0 :(得分:2)

创建迭代器后,您将添加到集合中 这引发了异常。

完成修改集合后,需要创建迭代器。

答案 1 :(得分:0)

这是因为&#34;增强了循环&#34;正如您使用它在幕后创建Iterator

事实上,当你写:

for (X x: whatever) {
    // do something with x
}

真实&#34;生成的代码类似于:

Iterator<X> iterator = whatever.iterator();

while (iterator.hasNext()) {
    X x = iterator.next();
    // do something with x
}

如果whatever实施Iterable<X>List执行;事实上,任何Collection都会执行)

在您的示例中,您创建了一个List<Character>,在其上创建了第一个Iterator<Character>,并且您的for循环在同一个列表中创建了另一个 Iterator<Character>

请注意,您在修改List之前创建了第一个...因此结果。第一个Iterator,仅在之后重复使用,将检测到同时,其基础列表已被修改:繁荣。