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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

郭凯敏

初级黑马

  • 黑马币:0

  • 帖子:32

  • 精华:0

本帖最后由 郭凯敏 于 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;
}
}



评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

15 个回复

倒序浏览
本帖最后由 王红霞 于 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, 下载次数: 58)

输出结果

输出结果
回复 使用道具 举报
王红霞 发表于 2012-7-22 08:29

王红霞同学只是贴了代码,还没有回答楼主的问题,为啥会运行错误。
回复 使用道具 举报
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:09
王红霞同学只是贴了代码,还没有回答楼主的问题,为啥会运行错误。

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


回复 使用道具 举报
这个问题,毕老师讲过的,简单来说就是你问下面还有元素没,它说有一个,你你跑下去要两个,人家没有,所以角标越界异常
回复 使用道具 举报
  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:34
8#
哥们,根本就没有错,你在仔细看看吧,不同的电脑上面会出现不同的结果的
回复 使用道具 举报
程潇 发表于 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:10
哥们,根本就没有错,你在仔细看看吧,不同的电脑上面会出现不同的结果的 ...

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

但是他真有元素啊.....
回复 使用道具 举报
王红霞 发表于 2012-7-22 12:02
System.out.println(((Student)it.next()).getName()+"***"+((Student)it.next()).getAge())
((Student)i ...

这个也没必要是同一个元素把,即使不是同一个元素,那么他也可以将不相同的元素的属性一次迭代出来啊.next方法的作用就是迭代下一个,这也没有违背我的意愿啊....就是让他一直迭代啊...
回复 使用道具 举报
郭凯敏 发表于 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:04
朱同学说的对呀   你看你有三个元素
System.out.println(((Student)it.next()).getName()+"***"+((Stude ...

OKOKOK,我懂了,所以一定要先复制给第三方变量是个好的习惯啊....其实我一直也是第一种写法,那天突然间想到这里,,,,谢谢
回复 使用道具 举报
  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 12:44
但是他真有元素啊.....

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

点评

对。我一般把迭代器迭代的值直接赋给一个它本身元素的变量,这样就可以避免多个的出现了.个人比较喜欢链式结构的编写,,,,所以才会出现上述问题..  发表于 2012-7-22 13:46

评分

参与人数 1黑马币 +2 收起 理由
郭凯敏 + 2 很给力!

查看全部评分

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