当前位置: 代码迷 >> J2SE >> "main" java.util.ConcurrentModificationException
  详细解决方案

"main" java.util.ConcurrentModificationException

热度:322   发布时间:2016-04-24 13:30:22.0
java的简单问题,恳请赐教
import java.util.*;//ArrayList类和Iterator接口都在此包中
public class testcollection
{
public static void main(String[] args)
{
int b=0;
ArrayList a1=new ArrayList();

System.out.println("Please Enter Number:");
while(true)
{
try
{
b=System.in.read();
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
if(b=='\r'|b=='\n')
break;
else
{
int num=b-'0';
a1.add(new Integer(num));
}
}
int sum=0;
[color=#FF0000]Iterator itr=a1.iterator();[/color]
while(itr.hasNext())
{
Integer intObj=(Integer)itr.next();
sum+=intObj.intValue();
}
System.out.println(sum);
}
}
上面这段程序是正确的
但是我把
[color=#FF0000]Iterator itr=a1.iterator();[/color]
这句话放到main方法开头去定义,就报错
就象下面
import java.util.*;//ArrayList类和Iterator接口都在此包中
public class testcollection
{
public static void main(String[] args)
{
int b=0;
ArrayList a1=new ArrayList();
[color=#FF0000]Iterator itr=a1.iterator();[/color]
System.out.println("Please Enter Number:");
while(true)
{
try
{
b=System.in.read();
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
if(b=='\r'|b=='\n')
break;
else
{
int num=b-'0';
a1.add(new Integer(num));
}
}
int sum=0;

while(itr.hasNext())
{
Integer intObj=(Integer)itr.next();
sum+=intObj.intValue();
}
System.out.println(sum);
}
}
错误
Exception in thread "main" java.util.ConcurrentModificationException
  at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:449)
  at java.util.AbstractList$Itr.next(AbstractList.java:420)
  at testcollection.main(testcollection.java:32)

Process completed.
为啥阿
就是把[color=#FF0000]Iterator itr=a1.iterator();[/color]这个接口的定义放到开头了阿

------解决方案--------------------
Iterator是快速失败的 一旦你创建了迭代器 你就不能用原来的容器的方法改变容器的内容(add remove等方法),只能使用迭代器中的方法
参见API文档
------解决方案--------------------

iterator()接口契约的功能是返回一个当前容器中内容的迭代者

也就是在你从命令行中输入字符,以执行(a1.add(new Integer(num)); )之前
a1中不存在任何内容

当时他执行iterator()的结果也必然是个空迭代者


int b=0; 
ArrayList a1=new ArrayList(); 
//这里的a1.iterator()返回的是一个空的迭代者
System.out.println("Please Enter Number:"); 
while(true) 

try 

b=System.in.read(); 

catch(Exception e) 

System.out.println(e.getMessage()); 

if(b== '\r ' ¦b== '\n ') 
break; 
else 

int num=b- '0 '; 
a1.add(new Integer(num)); 


int sum=0; 
Iterator itr=a1.iterator();
while(itr.hasNext()) 

Integer intObj=(Integer)itr.next(); 
sum+=intObj.intValue(); 

System.out.println(sum); 


##############################

楼主可能进入了"一个实例的一个方法返回的引用都是一致"的思想误区

实际上几乎所有Iterable的iterator()方法返回的引用都是不一样的

你可以测试下
Java code
ArrayList a1=new ArrayList(); System.out.println(a1.iterator().hashcode());System.out.println(a1.iterator().hashcode());System.out.println(a1.iterator().hashcode());System.out.println(a1.iterator().hashcode());
  相关解决方案