为了账号安全,请及时绑定邮箱和手机立即绑定

并发修改例外

并发修改例外

饮歌长啸 2019-07-30 16:45:50
并发修改例外我有这段小代码,它给了我并发修改异常。我无法理解为什么我一直得到它,即使我没有看到任何同时进行的修改。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);     }}
查看完整描述

3 回答

?
慕雪6442864

TA贡献1812条经验 获得超5个赞

为避免这种情况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);

    }}

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


查看完整回答
反对 回复 2019-07-30
?
婷婷同学_

TA贡献1844条经验 获得超8个赞

我无法理解为什么我一直得到它,即使我没有看到任何同时进行的修改。

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

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


查看完整回答
反对 回复 2019-07-30
?
阿晨1998

TA贡献2037条经验 获得超6个赞

来自JavaDoc:对于ConcurrentModificatoinException:“一个线程修改一个集合而另一个线程迭代它时通常不允许”。

它只是意味着如果你仍然有一个打开的迭代器,则不允许修改列表,因为迭代器循环会中断。尝试移动ListIterator<String> it = s.listIterator();到for循环之后。


查看完整回答
反对 回复 2019-07-30
  • 3 回答
  • 0 关注
  • 438 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号