为什么在使用 listIterator.add() 时出现 noSuchElementException?

Why do I get noSuchElementException when using listIterator.add()?

事不宜迟,我会立即 post 我的代码。它非常简单,因此您在理解它时应该不会有任何问题。我的想法是 add color 在使用 listIterator 找到 "blue" 之后。显然这里有问题。

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;
    }
}

输出:

red
green
Exception in thread "main" java.util.NoSuchElementException
    at java.base/java.util.ArrayList$Itr.next(ArrayList.java:999)
    at Main.main(Main.java:21)

您调用 hasNext() 一次,调用 2 次 next()。调用一次保存即可多次使用

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)
}

所以基本上 iterator.next() 定位可迭代集合中的元素。 因此在你的 while 循环中多次调用 iterator.next() 会将光标移动到下一个值,因此最好将 iterator.next() 存储到循环内的变量中。