黑马程序员技术交流社区

标题: 视频学习中试出的问题。 [打印本页]

作者: toselect    时间: 2014-4-27 19:24
标题: 视频学习中试出的问题。
本帖最后由 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());这一行,如果把它删了是没有问题的。我就是想用迭代的方法在替换集合里面元素的同时把所有元素一一打印出来,这个在逻辑上有什么问题吗?



作者: 微笑=.一瞬间    时间: 2014-4-27 22:16
  //你写的代码不合理的地方我注释了并加上了解释 并且在下面还写了真确的代码 希望对你有帮助
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);
                                               
                }


        }
}



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

谢谢你的回答,很详细。
作者: 雪拉比    时间: 2014-4-29 13:19
支持一下看看
作者: 875588381    时间: 2014-4-29 14:46
我稍微修改了一下你的代码,觉得比较适合说明问题。
首先,为什么会抛出异常?很简单,因为容易中的游标已经走到了末尾,末尾之后已经没有元素了!
其次,next方法,会返回一个元素,然后将游标指向这个元素的后边。
set方法会将当前游标之前的这个元素更改掉。

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

code.jpg





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