A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 朱盛文 中级黑马   /  2013-3-16 20:34  /  1662 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 朱盛文 于 2013-3-16 23:24 编辑
  1. import java.util.ArrayList;
  2. import java.util.Collection;
  3. import java.util.Iterator;


  4. public class CollectionDemo {
  5.         public static void main(String[] args) {
  6.                 // 创建集合对象
  7.                 Collection c = new ArrayList();

  8.                 // 创建元素对象
  9.                 Student s1 = new Student("zhangsan", 20);
  10.                 Student s2 = new Student("lisi", 18);
  11.                 Student s3 = new Student("wangwu", 19);

  12.                 // 添加元素
  13.                 c.add(s1);
  14.                 c.add(s2);
  15.                 c.add(s3);
  16.         
  17.                 // 遍历元素
  18.                 Iterator it = c.iterator();
  19.                 while (it.hasNext()) {
  20.                         Student s = (Student) it.next();
  21.                         System.out.println(s.getName() + "***" + s.getAge());
  22.                 }               

  23.                 System.out.println("***********************************");
  24.                 it = c.iterator();
  25.                 while (it.hasNext()) {                        
  26.                         System.out.println(((Student) (it.next())).getName() + "***"+ ((Student) (it.next())).getAge());
  27.                 }
  28.         }
  29. }


  30. //----------------------------------------------------------------------------------------------------------------------------------


  31. class Student {
  32.         private String name;
  33.         private int age;

  34.         public Student() {
  35.         }

  36.         public Student(String name, int age) {
  37.                 this.name = name;
  38.                 this.age = age;
  39.         }

  40.         public String getName() {
  41.                 return name;
  42.         }

  43.         public void setName(String name) {
  44.                 this.name = name;
  45.         }

  46.         public int getAge() {
  47.                 return age;
  48.         }

  49.         public void setAge(int age) {
  50.                 this.age = age;
  51.         }        
  52. }
复制代码
为何运行时会出现如下异常呢?
          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)

为什么前面能正常遍历元素,而后面就出现异常了?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

5 个回复

正序浏览
明白了,谢谢大家咯
回复 使用道具 举报
本帖最后由 夏晓彤 于 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异常
回复 使用道具 举报
  1. it = c.iterator();
  2.                 while (it.hasNext()) {                        
  3.                         System.out.println(((Student) (it.next())).getName() + "***"+ ((Student) (it.next())).getAge());//错就在这里,因为每次执行打印语句时,都会调用it.next()两次,打印姓名时迭代了一次,打印年龄有迭代了一次,返回了下一个对象,这时就已经出错了,所以结果打印的不是同一个人得姓名和年龄;然后再循环,执行,就没有元素了迭代了,   此时就有了没有这个元素异常。          }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
因为你用用迭代器遍历了两遍,当第一遍遍历完后,迭代器中的索引已经到了最后,it.hasNext()就为假了,没有可以遍历的元素了。
迭代器遍历集合和for循环遍历数组是不一样的。
回复 使用道具 举报
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()方法

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马