猿问

并发修改例外

并发修改例外

我有这段小代码,它给了我并发修改异常。我无法理解为什么我一直得到它,即使我没有看到任何同时进行的修改。

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);
    }}


qq_花开花谢_0
浏览 300回答 3
3回答

隔江千里

为避免这种情况ConcurrentModificationException,您应该像这样编写代码:import&nbsp;java.util.*;public&nbsp;class&nbsp;SomeClass&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List<String>&nbsp;s&nbsp;=&nbsp;new&nbsp;ArrayList<String>(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(String&nbsp;a&nbsp;:&nbsp;args) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.add(a); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ListIterator<String>&nbsp;it&nbsp;=&nbsp;s.listIterator();&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(it.hasNext())&nbsp;{&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;item&nbsp;=&nbsp;it.next();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(s); &nbsp;&nbsp;&nbsp;&nbsp;}}A&nbsp;java.util.ListIterator允许您在迭代期间修改列表,但不允许在创建和使用它之间修改列表

慕娘9325324

我无法理解为什么我一直得到它,即使我没有看到任何同时进行的修改。在创建迭代器和开始使用迭代器之间,您向要迭代的列表添加了参数。这是一个并发修改。&nbsp;&nbsp;&nbsp;&nbsp;ListIterator<String>&nbsp;it&nbsp;=&nbsp;s.listIterator();&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(String&nbsp;a&nbsp;:&nbsp;args) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.add(a);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;concurrent&nbsp;modification&nbsp;here &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(it.hasNext()) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;item&nbsp;=&nbsp;it.next();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;exception&nbsp;thrown&nbsp;here在完成向列表中添加元素之后创建迭代器:&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(String&nbsp;a&nbsp;:&nbsp;args) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.add(a);&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;ListIterator<String>&nbsp;it&nbsp;=&nbsp;s.listIterator();&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(it.hasNext()) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;item&nbsp;=&nbsp;it.next();

尚方宝剑之说

来自JavaDoc:对于ConcurrentModificatoinException:“一个线程修改一个集合而另一个线程迭代它时通常不允许”。它只是意味着如果你仍然有一个打开的迭代器,则不允许修改列表,因为迭代器循环会中断。尝试移动ListIterator<String> it = s.listIterator();到for循环之后。
随时随地看视频慕课网APP

相关分类

Java
我要回答