黑马程序员技术交流社区
标题:
关于Collection集合遍历时出现的问题
[打印本页]
作者:
朱盛文
时间:
2013-3-16 20:34
标题:
关于Collection集合遍历时出现的问题
本帖最后由 朱盛文 于 2013-3-16 23:24 编辑
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class CollectionDemo {
public static void main(String[] args) {
// 创建集合对象
Collection c = new ArrayList();
// 创建元素对象
Student s1 = new Student("zhangsan", 20);
Student s2 = new Student("lisi", 18);
Student s3 = new Student("wangwu", 19);
// 添加元素
c.add(s1);
c.add(s2);
c.add(s3);
// 遍历元素
Iterator it = c.iterator();
while (it.hasNext()) {
Student s = (Student) it.next();
System.out.println(s.getName() + "***" + s.getAge());
}
System.out.println("***********************************");
it = c.iterator();
while (it.hasNext()) {
System.out.println(((Student) (it.next())).getName() + "***"+ ((Student) (it.next())).getAge());
}
}
}
//----------------------------------------------------------------------------------------------------------------------------------
class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
复制代码
为何运行时会出现如下异常呢?
Exception in thread "main" java.util.NoSuchElementException
at java.util.ArrayList$Itr.next(ArrayList.java:794)
at cn.itcast_04.CollectionDemo2.main(CollectionDemo2.java:57)
为什么前面能正常遍历元素,而后面就出现异常了?
作者:
沈子豪
时间:
2013-3-16 20:52
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class CollectionDemo {
public static void main(String[] args) {
// 创建集合对象
Collection c = new ArrayList();
// 创建元素对象
Student s1 = new Student("zhangsan", 20);
Student s2 = new Student("lisi", 18);
Student s3 = new Student("wangwu", 19);
// 添加元素
c.add(s1);
c.add(s2);
c.add(s3);
// 遍历元素
Iterator it = c.iterator();
while (it.hasNext()) {
Student s = (Student) it.next();
System.out.println(s.getName() + "***" + s.getAge());
}
System.out.println("***********************************");
it = c.iterator();
while (it.hasNext()) {
System.out.println(((Student) (it.next())).getName() + "***"+ ((Student) (it.next())).getAge());
}
}
}
//----------------------------------------------------------------------------------------------------------------------------------
class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
这个异常代表是无元素异常,迭代器直接往下读,所以读出来的依次是第一个元素的name,第二个元素的age,第三个元素的name,第四个元素的age,而没有第四个元素,所以出现异常
注意:迭代的过程中最好只用一次next()方法
作者:
黑马李超
时间:
2013-3-16 20:55
因为你用用迭代器遍历了两遍,当第一遍遍历完后,迭代器中的索引已经到了最后,it.hasNext()就为假了,没有可以遍历的元素了。
迭代器遍历集合和for循环遍历数组是不一样的。
作者:
HM王琦
时间:
2013-3-16 20:58
it = c.iterator();
while (it.hasNext()) {
System.out.println(((Student) (it.next())).getName() + "***"+ ((Student) (it.next())).getAge());//错就在这里,因为每次执行打印语句时,都会调用it.next()两次,打印姓名时迭代了一次,打印年龄有迭代了一次,返回了下一个对象,这时就已经出错了,所以结果打印的不是同一个人得姓名和年龄;然后再循环,执行,就没有元素了迭代了, 此时就有了没有这个元素异常。 }
复制代码
作者:
夏晓彤
时间:
2013-3-16 21:01
本帖最后由 夏晓彤 于 2013-3-16 21:04 编辑
System.out.println(((Student) (it.next())).getName() + "***"+ ((Student) (it.next())).getAge());
这一句连续调用了2次next()方法,前面和后面it.next())取出的不是同一个对象,如集合只有3个元素,第一次执行这句就取出2个了,及s1的名字,s2年龄,在循环一次,取第s3和第s4,而s4不存在所有会出现NoSuchElementException异常
作者:
朱盛文
时间:
2013-3-16 23:23
明白了,谢谢大家咯
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2