黑马程序员技术交流社区

标题: 帮我看看这样迭代器这样使用为啥会运行错误呢? [打印本页]

作者: 郭凯敏    时间: 2012-7-22 04:29
标题: 帮我看看这样迭代器这样使用为啥会运行错误呢?
本帖最后由 郭凯敏 于 2012-7-22 13:07 编辑

这是我的代码:

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
/*
* 用集合存储自定义对象,并输出每个对象元素属性.
*/
public class IteratorTest {
public static void main(String[] args) {
  ArrayList<Student> c = new ArrayList<Student>();
  
  Student s1 = new Student();
  s1.setName("欧阳锋");
  s1.setAge(88);
  
  Student s2 = new Student();
  s2.setName("郭靖");
  s2.setAge(66);
  
  Student s3 = new Student();
  s3.setName("杨过");
  s3.setAge(48);
  
  c.add(s1);
  c.add(s2);
  c.add(s3);
  
  //System.out.println(c);
  Iterator<Student> it = c.iterator();
  while(it.hasNext()){
  Student s = (Student)it.next();
   System.out.println(s.getName()+"***"+s.getAge());

//   System.out.println(((Student)it.next()).getName()+"***"+((Student)it.next()).getAge());这个为什么会出错呢?编译正常,运行报错,java.util.NoSuchElementException,怎么就访问越界呢?和上面的一样的实现,上面那个就正确....求帮助。

这个问题题的有点表述不清,我重新描述下就是用蓝色的代码就报错,红色的就正常运行。(使用红色时注释蓝色,使用蓝色注释红色)

  }
}
}
--------------------------------------------------------------------华丽的分隔符-------------------------------------------------------------------------------------------------------------

/*
* 自定义对象
*/
public class Student {
private String name;
private int age;
public Student() {
}
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;
}
}




作者: 王红霞    时间: 2012-7-22 08:29
本帖最后由 王红霞 于 2012-7-22 11:58 编辑
  1. import java.util.ArrayList;
  2. import java.util.Collection;
  3. import java.util.Iterator;
  4. /*
  5. * 用集合存储自定义对象,并输出每个对象元素属性.
  6. */
  7. class Student {
  8. private String name;
  9. private int age;
  10. public Student() {
  11. }
  12. public String getName() {
  13.   return name;
  14. }
  15. public void setName(String name) {
  16.   this.name = name;
  17. }
  18. public int getAge() {
  19.   return age;
  20. }
  21. public void setAge(int age) {
  22.   this.age = age;
  23. }
  24. }

  25. public class IteratorTest {
  26. public static void main(String[] args) {
  27.   ArrayList<Student> c = new ArrayList<Student>();
  28.   
  29.   Student s1 = new Student();
  30.   s1.setName("欧阳锋");
  31.   s1.setAge(88);
  32.   
  33.   Student s2 = new Student();
  34.   s2.setName("郭靖");
  35.   s2.setAge(66);
  36.   
  37.   Student s3 = new Student();
  38.   s3.setName("杨过");
  39.   s3.setAge(48);
  40.   
  41.   c.add(s1);
  42.   c.add(s2);
  43.   c.add(s3);
  44.   
  45.   //System.out.println(c);
  46.   Iterator<Student> it = c.iterator();
  47.   while(it.hasNext()){
  48.    Student s = (Student)it.next();
  49.    System.out.println(s.getName()+"***"+s.getAge());
  50.   }
  51. }
  52. }
复制代码
C:\Users\wanghongxia\Desktop\a.jpg

a.jpg (7.06 KB, 下载次数: 57)

输出结果

输出结果

作者: 韦念欣    时间: 2012-7-22 11:09
王红霞 发表于 2012-7-22 08:29

王红霞同学只是贴了代码,还没有回答楼主的问题,为啥会运行错误。
作者: 程潇    时间: 2012-7-22 11:37
while(it.hasNext()){
   Student s = (Student)it.next();
   System.out.println(((Student)it.next()).getName()+"***"+((Student)it.next()).getAge());
}
//错误原因在于,print语句中的it.next()在不断的执行取下一个元素的操作,而不是你在Student s= (Student) it.next();中获得的s

作者: 王红霞    时间: 2012-7-22 11:55
韦念欣 发表于 2012-7-22 11:09
王红霞同学只是贴了代码,还没有回答楼主的问题,为啥会运行错误。

(⊙o⊙)…   昨晚通宵看了会视频,临睡前看了看帖子 小眼看错了…………
我改……



作者: 朱烈葵    时间: 2012-7-22 11:59
这个问题,毕老师讲过的,简单来说就是你问下面还有元素没,它说有一个,你你跑下去要两个,人家没有,所以角标越界异常
作者: 王红霞    时间: 2012-7-22 12:02
  System.out.println(((Student)it.next()).getName()+"***"+((Student)it.next()).getAge())
((Student)it.next()).getName()获取的是一个元素的name属性的值,
((Student)it.next()).getAge())获取的是下一个元素的age属性的值,两者不是属于同一个元素 所以会出错
而System.out.println(s.getName()+"***"+s.getAge());是对同一个元素获取name和age 所以不会出错
楼主可以返回去看看next函数的作用 。
作者: 杨朔    时间: 2012-7-22 12:10
哥们,根本就没有错,你在仔细看看吧,不同的电脑上面会出现不同的结果的
作者: 郭凯敏    时间: 2012-7-22 12:42
程潇 发表于 2012-7-22 11:37
while(it.hasNext()){
   Student s = (Student)it.next();
   System.out.println(((Student)it.next()).g ...

Student s = (Student)it.next();这句也不要......:handshake
作者: 郭凯敏    时间: 2012-7-22 12:43
杨朔 发表于 2012-7-22 12:10
哥们,根本就没有错,你在仔细看看吧,不同的电脑上面会出现不同的结果的 ...

哥们再看看我题目的需求吧。。。。。用被注释的代码替换相关正确的代码.....
作者: 郭凯敏    时间: 2012-7-22 12:44
朱烈葵 发表于 2012-7-22 11:59
这个问题,毕老师讲过的,简单来说就是你问下面还有元素没,它说有一个,你你跑下去要两个,人家没有,所以 ...

但是他真有元素啊.....
作者: 郭凯敏    时间: 2012-7-22 12:49
王红霞 发表于 2012-7-22 12:02
System.out.println(((Student)it.next()).getName()+"***"+((Student)it.next()).getAge())
((Student)i ...

这个也没必要是同一个元素把,即使不是同一个元素,那么他也可以将不相同的元素的属性一次迭代出来啊.next方法的作用就是迭代下一个,这也没有违背我的意愿啊....就是让他一直迭代啊...
作者: 王红霞    时间: 2012-7-22 13:04
郭凯敏 发表于 2012-7-22 12:44
但是他真有元素啊.....

朱同学说的对呀   你看你有三个元素
System.out.println(((Student)it.next()).getName()+"***"+((Student)it.next()).getAge())
欧阳锋***66
可是下面只剩一个元素可取了  只能取出最后一个元素的name 而到了it.next()).getAge()d的时候就没有元素可取了没有元素也就没办法去属性值了啊  所以出错的呀
作者: 郭凯敏    时间: 2012-7-22 13:06
王红霞 发表于 2012-7-22 13:04
朱同学说的对呀   你看你有三个元素
System.out.println(((Student)it.next()).getName()+"***"+((Stude ...

OKOKOK,我懂了,所以一定要先复制给第三方变量是个好的习惯啊....其实我一直也是第一种写法,那天突然间想到这里,,,,谢谢
作者: 于星星    时间: 2012-7-22 13:10
  1. package com.itheima.stringdemo;

  2. import java.util.ArrayList;
  3. import java.util.Collection;
  4. import java.util.Iterator;
  5. /*
  6. * 用集合存储自定义对象,并输出每个对象元素属性.
  7. */
  8. public class Test{
  9. public static void main(String[] args) {
  10.   ArrayList<Student> c = new ArrayList<Student>();
  11.   
  12.   Student s1 = new Student();
  13.   s1.setName("欧阳锋");
  14.   s1.setAge(88);
  15.   
  16.   Student s2 = new Student();
  17.   s2.setName("郭靖");
  18.   s2.setAge(66);
  19.   
  20.   Student s3 = new Student();
  21.   s3.setName("杨过");
  22.   s3.setAge(48);
  23.   
  24.   c.add(s1);
  25.   c.add(s2);
  26.   c.add(s3);
  27.   
  28.   //System.out.println(c);
  29.   Iterator<Student> it = c.iterator();
  30.   while(it.hasNext()){
  31.   Student s = (Student)it.next();
  32.    //System.out.println(s.getName()+"***"+s.getAge());
  33.    System.out.println[color=Red](((Student)it.next()).getName()+"***"+((Student)it.next()).getAge());[/color]  }
  34. }
  35. }
复制代码
你在一次一个循环的地方调用了两次迭代下一次,而while(it.hasNext())中只判断是否有下一个,如果有下一个就调用next方法,而你在打印过程中调用了两次next方法,而其中只有一个元素,所以第二个会报空指针错误。当你把第二个去掉就ok
作者: 朱烈葵    时间: 2012-7-22 13:35
郭凯敏 发表于 2012-7-22 12:44
但是他真有元素啊.....

明白 了?是不是这个意思,判断有一个,你要两个,人家没有,报null异常,没错吧,难道你没发现,你取出来和你设置进去不对吗,比如 欧阳锋 88是吧,郭靖 66 要是按你这样写 我估计打印出来时 欧阳锋 66岁 数据错乱啊,要求给分啊  可怜的我:dizzy:




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