黑马程序员技术交流社区
标题:
集合问题。。
[打印本页]
作者:
刘辉
时间:
2013-3-16 21:33
标题:
集合问题。。
import java.util.*;
class IteratorDemo
{
public static void main(String[] args) throws Exception
{
Collection c=new ArrayList();
Iterator it=c.iterator();
c.add("hello");
c.add("world");
c.add("java");
System.out.println("c:"+c);
while(it.hasNext())
{
Object obj=it.next();
System.out.println(obj);
}
}
}
怎么会报这个异常?求解。。
ConcurrentModificationException
作者:
沈子豪
时间:
2013-3-16 21:44
Exception in thread "main" java.util.ConcurrentModificationException:并发修改异常
在使用迭代器迭代元素的时候,不能使用集合去操作元素,否则,就会出现并发修改异常。
解决办法:
迭代器迭代的过程中,使用迭代器对象去添加元素。
作者:
戴乾刚
时间:
2013-3-16 21:53
这是一个非捕获型异常
通过Iterator进行遍历,如果直接对ArrayList集合进行操作后,再继续用之前的Iterator进行遍历就会出现这个异常,表示其ArrayList集合已经被修改
将Iterator那条语句放后面来就好了
import java.util.*;
class IteratorDemo
{
public static void main(String[] args) throws Exception
{
Collection c=new ArrayList();
//Iterator it=c.iterator();
c.add("hello");
c.add("world");
c.add("java");
System.out.println("c:"+c);
Iterator it=c.iterator();//------------该语句放在操作完之后
while(it.hasNext())
{
Object obj=it.next();
System.out.println(obj);
}
}
}
复制代码
作者:
彭颖
时间:
2013-3-16 21:54
本帖最后由 彭颖 于 2013-3-16 21:57 编辑
Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。
import java.util.*;
public class TestDemo {
public static void main(String[] args) throws Exception
{
Collection c=new ArrayList();
Iterator it=c.iterator();
c.add("hello");
c.add("world");
c.add("java");
System.out.println("c:"+c);
/* while(it.hasNext())
{
Object obj=it.next();
System.out.println(obj);
}*/
for(Object o : c){
System.out.print(o);
}
}
}
复制代码
--------------------------------------------
我觉得这样改动一样吧
作者:
itserious
时间:
2013-3-16 22:05
public static void main(String[] args) throws Exception
{
ArrayList c=new ArrayList();
// Iterator it=c.iterator();//提示:当方法检测到对象的
并发修改
,但不允许这种修改时,抛出此异常。
//因为你迭代集合的时候,你又去修改原集合(包括,添加,删除能引起原集合长度发生改变的都是不行),必然会引出问题。
//如果要用,可以用迭代器提供的方法。
c.add("hello");
c.add("world");
c.add("java");
Iterator it=c.iterator();//
这样就不会有那种现象了。
System.out.println("c:"+c);
while(it.hasNext())
{
Object obj=it.next();
System.out.println(obj);
}
}
}
作者:
HM张超
时间:
2013-3-16 23:30
list集合你还没有添加的时候就用了集合c的对象
把 Iterator it=c.iterator();写在c.add之后就OK了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2