并发修改异常

2022-08-31 23:46:56

我有这一小段代码,它给了我并发修改异常。我不明白为什么我一直得到它,即使我没有看到任何并发修改正在执行。

import java.util.*;

public class SomeClass {
    public static void main(String[] args) {
        List<String> s = new ArrayList<>();
        ListIterator<String> it = s.listIterator();

        for (String a : args)
            s.add(a);

        if (it.hasNext())
            String item = it.next();

        System.out.println(s);
    }
}

答案 1

要避免 ,您应该像这样编写代码:ConcurrentModificationException

import java.util.*;

public class SomeClass {

    public static void main(String[] args) {
        List<String> s = new ArrayList<String>();

        for(String a : args)
            s.add(a);

        ListIterator<String> it = s.listIterator();    
        if(it.hasNext()) {  
            String item = it.next();   
        }  

        System.out.println(s);

    }
}

A 允许您在迭代期间修改列表,但不能在创建和使用列表之间修改列表。java.util.ListIterator


答案 2

我不明白为什么我一直得到它,即使我没有看到任何并发修改正在执行。

在创建迭代器和开始使用迭代器之间,您向要迭代的列表添加了参数。这是并发修改。

    ListIterator<String> it = s.listIterator();  

    for (String a : args)
        s.add(a);                    // concurrent modification here

    if (it.hasNext())
        String item = it.next();     // exception thrown here

在完成向列表中添加元素后创建迭代器:

    for (String a : args)
        s.add(a); 

    ListIterator<String> it = s.listIterator();  
    if (it.hasNext())
        String item = it.next();

推荐