Java 为什么在使用listIterator.add()时会得到NoTouchElementException?
不再拖延,我将立即发布我的代码。它非常简单,所以你在理解它时不会发现任何问题。我的想法是使用Java 为什么在使用listIterator.add()时会得到NoTouchElementException?,java,iterator,add,nosuchelementexception,Java,Iterator,Add,Nosuchelementexception,不再拖延,我将立即发布我的代码。它非常简单,所以你在理解它时不会发现任何问题。我的想法是使用列表迭代器在找到蓝色后添加颜色。显然这里有点不对劲 public class Main { public static void main(String[] args) { Color c1 = new Color("red"); Color c2 = new Color("blue"); Color c3 =
列表迭代器在找到蓝色后添加颜色。显然这里有点不对劲
public class Main {
public static void main(String[] args) {
Color c1 = new Color("red");
Color c2 = new Color("blue");
Color c3 = new Color("green");
List<Color> list = new ArrayList<>();
list.add(c1);
list.add(c2);
list.add(c3);
ListIterator<Color> iterator = list.listIterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
if (iterator.next().tone.equals("blue")){
iterator.add(new Color("yellow"));
}
}
}
}
class Color {
String tone;
public Color(String tone) {
this.tone = tone;
}
@Override
public String toString() {
return tone;
}
}
对于next()
的两次调用,您只需调用一次hasNext()
。调用一次并保存它,以便能够多次使用
while (iterator.hasNext()){
Color current = iterator.next();
System.out.println(current);
if (current.tone.equals("blue")){
iterator.add(new Color("yellow"));
}
}
我知道答案已经提供了,但如果有帮助的话,请发布
请参阅以下代码:-
public static void main(String[] args) {
Color c1 = new Color("red");
Color c2 = new Color("blue");
Color c3 = new Color("green");
List<Color> list = new ArrayList<>();
list.add(c1);
list.add(c2);
list.add(c3);
ListIterator<Color> iterator = list.listIterator();
System.out.println(iterator.next());//-->red
System.out.println(iterator.next());//-->blue
System.out.println(iterator.next());//-->green
System.out.println(iterator.next());//-->java.util.NoSuchElementException (iterator is moved forward but list is exhausted)
}
publicstaticvoidmain(字符串[]args){
颜色c1=新颜色(“红色”);
颜色c2=新颜色(“蓝色”);
颜色c3=新颜色(“绿色”);
列表=新的ArrayList();
增加(c1);
增加(c2);
增加(c3);
ListIterator迭代器=list.ListIterator();
System.out.println(iterator.next());//-->红色
System.out.println(iterator.next());//-->蓝色
System.out.println(iterator.next());//-->绿色
System.out.println(iterator.next());//-->java.util.NoSuchElementException(iterator向前移动,但列表已用尽)
}
因此基本上,iterator.next()
在iterable集合中定位元素。
因此,在ur中多次调用iterator.next()
while
循环将每次光标移动到下一个值,因此最好将iterator.next()
存储到循环中的变量中。谢谢azro!您能帮我理解该异常的名称吗?因为next()
技术上没有删除我的元素,它只是移动了光标。@Stefan“嗨,我想要下一个元素”,“对不起,我的实际迭代器中没有这样的元素”从我们现在的位置没有“next”元素,所有的元素都被消耗了,真的,我终于得到了:)尽管。next()
在if循环中,它仍在调用next()
。你是这么说的?所以最终在最后一次调用中将不会有更多的元素,我调用next()
。对吗?@Stefan是的,if中的.next()
会向前移动光标,每次调用next()都会向前移动光标,因此使用hasNext,您肯定可以执行1次移动,但实际上是执行2次移动
public static void main(String[] args) {
Color c1 = new Color("red");
Color c2 = new Color("blue");
Color c3 = new Color("green");
List<Color> list = new ArrayList<>();
list.add(c1);
list.add(c2);
list.add(c3);
ListIterator<Color> iterator = list.listIterator();
System.out.println(iterator.next());//-->red
System.out.println(iterator.next());//-->blue
System.out.println(iterator.next());//-->green
System.out.println(iterator.next());//-->java.util.NoSuchElementException (iterator is moved forward but list is exhausted)
}