黑马程序员技术交流社区

标题: 请大家看看为什么出错 [打印本页]

作者: doyxy    时间: 2014-1-13 11:04
标题: 请大家看看为什么出错
本帖最后由 doyxy 于 2014-1-13 14:02 编辑

arraylist的练习,看着和毕老师的代码没什么区别,为什么运行会报错呢?

Exception in thread "main" java.util.NoSuchElementException
        at java.util.ArrayList$Itr.next(ArrayList.java:834)
        at ArrayListTest2.getSingle(ArrayListTest2.java:69)
        at ArrayListTest2.main(ArrayListTest2.java:50)




  1. /*
  2. list集合中判断元素是否相同,使用的是元素的equals方法
  3. */
  4. import java.util.*;

  5. class Person
  6. {
  7.         private String name;
  8.         private int age;
  9.         Person(String name, int age)
  10.         {
  11.                 this.name = name;
  12.                 this.age = age;
  13.         }
  14.         public String getName()
  15.         {
  16.                 return name;
  17.         }
  18.         public int getAge()
  19.         {
  20.                 return age;
  21.         }
  22.         public boolean equals(Object obj)
  23.         {
  24.                 if (!(obj instanceof Person))//判断类型
  25.                         return false;

  26.                 Person p = (Person)obj;//转型

  27.                 return this.name.equals(p.name) && this.age == p.age;//重写判断方法.
  28.                
  29.         }
  30. }

  31. class ArrayListTest2
  32. {
  33.         public static void main(String[] args)
  34.         {
  35.                 ArrayList al = new ArrayList();
  36.                 al.add(new Person("lisi01",23));
  37.                 al.add(new Person("lisi02",25));
  38.                 al.add(new Person("lisi02",23));
  39.                 al.add(new Person("lisi03",32));
  40.                 al.add(new Person("lisi04",33));
  41.                 al.add(new Person("lisi04",33));
  42.                 al.add(new Person("lisi05",20));

  43.                 al = getSingle(al);

  44.                 Iterator it = al.iterator();
  45.                 while (it.hasNext())
  46.                 {
  47.                         Person p = (Person)it.next();//多态问题,需要向下转型.
  48.                         sop(p.getName()+"..."+p.getAge());
  49.                 }

  50.         }
  51.         public static ArrayList getSingle(ArrayList al)
  52.         {
  53.                 ArrayList alnew = new ArrayList();
  54.                 //使用迭代器
  55.                 Iterator it = al.iterator();
  56.                 //历遍
  57.                 while (it.hasNext())
  58.                 {
  59.                         if (!alnew.contains(it.next()))
  60.                                 alnew.add(it.next());
  61.                 }
  62.                 return alnew;               
  63.         }

  64.         public static void sop(Object obj)
  65.         {
  66.                 System.out.println(obj);
  67.         }
  68. }
复制代码




作者: 几番意难相付    时间: 2014-1-13 11:34
第68行
   if (!alnew.contains(it.next()))
        alnew.add(it.next());
首要你要明白迭代的原理
假设要迭代一个存储了3个元素的集合
迭代有一个指针
调用 it.next() 指针指向集合的0号角标
再调用一次 it.next() 指针指向集合的1号角标

所以在以上两句代码中
if (!alnew.contains(it.next())) 判断的假如是在集合中0角标的位置
alnew.add(it.next());添加的并不是if语句中所判断的那个所在0角标位置的元素
而是1角标位置的元素
这样当迭代到集合的最后一个元素时 如果继续调用it.next 就超过了集合中元素的个数 类似于数组角标越界

这个异常也就是集合的“数组角标越界异常”

建议将it.next元素先存储到一个变量中 然后对这个变量进行判断和添加到另一个集合中

像这样
  1.      while (it.hasNext())
  2.                 {
  3.                         Person p=(Person) it.next();
  4.                         if (!alnew.contains(p))
  5.                                 alnew.add(p);
  6.                 }
复制代码


作者: doyxy    时间: 2014-1-13 14:01
原来如此,谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2