这是因为 li.next(); 会将li 返回当前元素,并且指向下一个元素,即执行了一次,下次在执行 li.next()返回的就是下一个元素了。
if(!(nl.contains(li.next())))
nl.add(li.next()); //这里执行了两次next(),却没有进行判断 hasNext(),当上一次next() 已经到达li 尾部时,这里当然就要报错了。
第一次判断的时候: if (!(nl.contains(li.next()))),迭代器下标(姑且如此理解)会移动到0,
然后判断为true,进入:nl.add(li.next());,这里又调用了next方法,迭代器下标会移动到1。
然后进入下个循环,进行判断的时候,迭代器下标已经是2了。少判断下标为1的。
等你每次循环,迭代器都向后移动了两次。。。
li.next方法你理解的不好。调用此方法是取迭代器中下一个元素,迭代器下标+1。
li.hasNext 是是否有下个元素,迭代器下标不变。
while(li.hasNext())
{
Object obj=li.next();
if(!(nl.contains(obj)))
nl.add(obj);
}
return nl;
修改完之后 ,li.next,缓存到一个变量。判断,然后添加到 最后结果。这样每个循环只调用一次 next(每过一个循环,迭代器下标+1),符合要求 。 |