A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 我是小白 中级黑马   /  2013-3-26 23:03  /  1823 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

ArrayList e1=new ArrayList();
e1.add("java01");
e1.add("java02");
e1.add("java03");
e1.add("java04");
ListIterator li =e1.listIterator();
while(li.hasNext())
{
    Object obj=li.next();
    if(obj.equals("java01"))
        e1.add("java009");
        li.set("java006");
}

上述代码运行的时候为什么会报java.util.ConcurrentModificationException,不是已经使用了List特有的迭代器了么?

点评

如果你的问题已经得到解决,请及时将主题改为[已解决],如果还有问题请继续追问,谢谢!  发表于 2013-3-27 10:52

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

8 个回复

倒序浏览
  if(obj.equals("java01"))
        e1.add("java009");//这里你忘了,你用的是Arraylist的对象方法 add,不是ListIterator的对话方法 add
        li.set("java006");
回复 使用道具 举报
楼上说的差不多.你用的是ArrayList的方法添加的当然不对了...应该用ListIterator的方法.....不应该e1.应该是li
ArrayList e1=new ArrayList();
e1.add("java01");
e1.add("java02");
e1.add("java03");
e1.add("java04");
ListIterator li =e1.listIterator();
while(li.hasNext())
{
     Object obj=li.next();
     if(obj.equals("java01"))
         e1.add("java009");//这里你改一下.li.add("java009");试试.
         li.set("java006");
}

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

回复 使用道具 举报
ListIterator li =e1.listIterator();
while(li.hasNext())
{
     Object obj=li.next();
     if(obj.equals("java01"))
         e1.add("java009");
         li.set("java006");
}
你使用列表迭代器ListIterator就要用列表迭代器的方法,
你现在用的是  e1.add("java009");集合中的方法,所有会报java.util.ConcurrentModificationException
修改一下就好了,用 li.add("java009");这样就不会报异常了;

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

回复 使用道具 举报
Iterator迭代器在迭代的过程中检测到该集合已经被修改,程序就会立即引发java.util.ConcurrentModificationException异常,这样可以避免共享资源而引发的潜在问题,而上述代码中e1.add("java009")是在修改正在遍历的集合,所以会引发这种异常,应该采用listIterator提供的add()方法来对集合进行修改,应该改为
import java.util.*;
class Demo{
        public static void main(String[] args){
                List<String> e1 = new ArrayList<String>();//最好改成面向List接口编程,便于以后的扩展。
                e1.add("java01");
                e1.add("java02");
                e1.add("java03");
                e1.add("java04");
                ListIterator<String> li =e1.listIterator();
                while(li.hasNext())
                {
                    String obj=li.next();
                    if(obj.equals("java01"))
                       li.add("java009");
                      //li.set("java006"); 迭代器并未提供这种方法,不能使用。
                }
                                System.out.println(e1);
        }

}

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

回复 使用道具 举报
ArrayList e1=new ArrayList();
e1.add("java01");
e1.add("java02");
e1.add("java03");
e1.add("java04");
ListIterator li =e1.listIterator();
while(li.hasNext())
{
    Object obj=li.next();
    if(obj.equals("java01"))
       li.add("java009"); //这里应该调用迭代器的add()方法
        li.set("java006");
}
说明:如果你调用集合的add()方法增加对象时,这时候你没有通知迭代器,就会产生集合与迭代器不匹配。就是指针没有指向正确的位置,由于你添加了一个对象,但是迭代器不知道,所以它会错误的指向下下个对象。不知道这样说你是否明白!
回复 使用道具 举报
王维帝 发表于 2013-3-27 10:18
Iterator迭代器在迭代的过程中检测到该集合已经被修改,程序就会立即引发java.util.ConcurrentModification ...

ListIterator迭代器是有set()方法的,替换操作
回复 使用道具 举报
按楼主的方法,list变化时,迭代器还是用的原来的迭代器,并为随着list的更新而更新。要用迭代器的add方法。
回复 使用道具 举报
对集合遍历时集合的元素只能用迭代器修改
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马