黑马程序员技术交流社区

标题: 关于listIterator和add方法问题。 [打印本页]

作者: 杨文宇    时间: 2012-8-7 18:20
标题: 关于listIterator和add方法问题。
本帖最后由 杨文宇 于 2012-8-7 18:25 编辑

class Test {
        
        public static void main(String[] args) {
                List list = new ArrayList();
                list.add("aaa");
                list.add("bbb");
                list.add("ccc");
                ListIterator it = list.listIterator();
                while(it.hasNext()){
                it.next();
                list.add("111");//为什么这里调用add方法会报错。
                }
                System.out.println(list);
        }
}


Exception in thread "main" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at javaEnhance.Test.main(Test.java:33)
这是什么异常
作者: 余明辉    时间: 2012-8-7 19:23
iterator是在一个独立线程工作的,是有一把锁的。当iterator被创建的时候,他有一个指针指向原来的对象,并且他自己的一个索引表,当你用不是迭代器的方法对容器操作时,迭代器有可能找到的对象和容器中的对象是不同的,所以就会引发这个错误。
对集合操作的时候,最好别混用
作者: 张_涛    时间: 2012-8-7 19:26
嘿嘿,帮你顶一下,记者回来看帖哦!
作者: 张雪磊    时间: 2012-8-7 19:30
本帖最后由 张雪磊 于 2012-8-7 19:36 编辑

本帖最后由 杨文宇 于 2012-8-7 18:25 编辑


class Test {
        
        public static void main(String[] args) {
                List list = new ArrayList();
                list.add("aaa");
                list.add("bbb");
                list.add("ccc");
                ListIterator it = list.listIterator();
                while(it.hasNext()){
                it.next();
                list.add("111");//为什么这里调用add方法会报错。//list.add("111")改成 li.add("111");
                }
                System.out.println(list);
        }
}


Exception in thread "main" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at javaEnhance.Test.main(Test.java:33)  

这是并发修改异常,当你定义了迭代器的时候,你的集合里边的数据就有两个方法在操作它们了,一个是集合的方法,一个是迭代器的方法,你在用迭代器迭代集合的时候用的是迭代器,如果这时候你再用集合的方法对集合进行添删操作,就冲突了,你把错误的代码用迭代器的add方法添加就好了,具体造作把错误代码改成红色部分


















1.jpg (48.76 KB, 下载次数: 30)

这个是LIstIterator里的方法

这个是LIstIterator里的方法

作者: 谭培龙    时间: 2012-8-7 21:06
}

class Test {
   
    public static void main(String[] args) {
            List list = new ArrayList();
            list.add("aaa");
            list.add("bbb");
            list.add("ccc");
            ListIterator it = list.listIterator();
            while(it.hasNext()){
            //it.next();
            //list.add("111");//为什么这里调用add方法会报错。  因为在迭代器中使用了集合的方法,如果改为li.add("111")并把他和上面代码换个位置就能运行
            it.add("111");//注意 这个语句不能放在下面,可以理解成在迭代过程中整个list的状态不能发生改变。
            it.next();
            }
            System.out.println(list);
    }
}

按照我这样就可以通过。

作者: 杨文宇    时间: 2012-8-8 17:38
public void add(E e) {
            checkForComodification();

            try {
                int i = cursor;
                AbstractList.this.add(i, e);
                lastRet = -1;
                cursor = i + 1;
                expectedModCount = modCount;//-------(1)
            } catch (IndexOutOfBoundsException ex) {
                throw new ConcurrentModificationException();
            }
        }
private void checkForComodification() {
        if (this.modCount != l.modCount)       //------(2)
            throw new ConcurrentModificationException();
    }

还是不太懂,是不是和上面两个标志的代码有关?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2