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