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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© toselect 中级黑马   /  2014-4-27 19:24  /  1337 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 toselect 于 2014-4-28 22:34 编辑
  1. 这是在学习视频时稍微改了下代码试了试,结果编译通过但是运行结果是java02,后面跟着几行和Exception相关的提示。
复制代码
  1. import java.util.*;
  2. class questionDemo
  3. {
  4.         public static void sop(Object obj)
  5.         {
  6.                 System.out.println(obj);
  7.         }
  8.         public static void main(String[] args)
  9.         {
  10.                 ArrayList al=new ArrayList();
  11.                         al.add("java01");
  12.                         al.add("java02");
  13.                         al.add("java03");
  14.                         sop("原集合是:"+al);
  15.                 for(ListIterator Li=al.listIterator();Li.hasNext();)
  16.                 {
  17.                         
  18.                         if(Li.next().equals("java03"))
  19.                         Li.set("java09");
  20.                         sop(Li.next());
  21.                 }


  22.         }
  23. }
复制代码
问题出在sop(Li.next());这一行,如果把它删了是没有问题的。我就是想用迭代的方法在替换集合里面元素的同时把所有元素一一打印出来,这个在逻辑上有什么问题吗?


评分

参与人数 1技术分 +1 收起 理由
Silent_memory + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
  //你写的代码不合理的地方我注释了并加上了解释 并且在下面还写了真确的代码 希望对你有帮助
import java.util.*;
class questionDemo
{
        public static void sop(Object obj)
        {
                System.out.println(obj);
        }
        public static void main(String[] args)
        {
                ArrayList al=new ArrayList();
                        al.add("java01");
                        al.add("java02");
                        al.add("java03");
                        sop("原集合是:"+al);
                for(ListIterator Li=al.listIterator();Li.hasNext();)
                {


                                             /*
                                                if(Li.next().equals("java03"))//首先你这个地方已经使用过li.next()
                                                Li.set("java09");
                                                 sop(Li.next());//这个地方又用了Li.next()这就相当于你没隔一个输出一个,所以输到最后会出现NoSuchElementException
                                                */
                                                //在上面的迭代过程中出现了两次Li.next()所以每次迭代指针会后移两位 而你加入的数据时基数所以会出现NoSuchElementException异常,如果你加入的是偶数个数据的话 运行时没问题不过输出的结果不是你想看到的,只会输出偶数位是上的值
                                                //正确代码
                                                String s=(String)Li.next();
                                                if("java03".equals(s))
                                                {       
                                                        Li.set("java09");
                                                        s=("java09");
                                                }
                                                System.out.println(s);
                                               
                }


        }
}


评分

参与人数 1技术分 +1 收起 理由
Silent_memory + 1 赞一个!

查看全部评分

回复 使用道具 举报
每执行一次next方法,指针就会移动一个位置;遍历到最后一个元素的时候,可以通过hasNext的判断,但是进入for循环以后指针移动了两次,导致指针越位
回复 使用道具 举报
微笑=.一瞬间 发表于 2014-4-27 22:16
//你写的代码不合理的地方我注释了并加上了解释 并且在下面还写了真确的代码 希望对你有帮助
import java ...

谢谢你的回答,很详细。
回复 使用道具 举报
支持一下看看
回复 使用道具 举报
我稍微修改了一下你的代码,觉得比较适合说明问题。
首先,为什么会抛出异常?很简单,因为容易中的游标已经走到了末尾,末尾之后已经没有元素了!
其次,next方法,会返回一个元素,然后将游标指向这个元素的后边。
set方法会将当前游标之前的这个元素更改掉。

code.jpg (112.09 KB, 下载次数: 3)

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