在Iterator中调用next()两次会引发NoSuchElementException



我正在从一个序列中检索多个值,但对于来自同一序列的一组单独的值,需要这样做两次。如果我调用其中一个,我会正确地返回所有内容,但调用next()两次会得到NoSuchElementException。在网上读到这篇文章后,我发现在调用next()一次之后,任何其他时间再次调用它基本上都会返回迭代器false。如何从同一Collection中获得两组独立的数据?

while (ai.hasNext()) {
   String ao = ai.next().getImageURL(ImageSize.MEGA);
   String an= ai.next().getName();
}

您可以将next()存储为临时变量。将以下代码中的Object替换为正在迭代的数据类型。

while(ai.hasNext()){
    Object temp = ai.next();
    String ao = temp.getImageUrl(ImageSize.MEGA);
    String an = temp.getName();

}

如果您不确定您的列表中有偶数个元素,您只需要在第二次调用next()之前添加if (ai.hasNext())

while (ai.hasNext()) {
   String ao = ai.next().getImageURL(ImageSize.MEGA);
   if (ai.hasNext())) {
      String an= ai.next().getName();
      ...
   }
}

当您的集合中的元素数量不均匀时,您会遇到此错误,您不应该在不检查是否存在内容的情况下调用next()两次;你这样做本质上是在突破while loop的要点。

只要集合中有东西可以得到,next()就会工作。这是一个在JDK1.6.0_23 上运行良好的代码示例

    Collection<String> aCollection = new ArrayList<String>();
    aCollection.add("1");
    aCollection.add("2");
    Iterator<String> i = aCollection.iterator();
    String firstString = null;
    String secondString = null;
    while (i.hasNext()) {
        firstString = (String) i.next();
        secondString = (String) i.next();
    }
    System.out.println(firstString);
    System.out.println(secondString);

如果将另一个String添加到Collection中,则最终会得到一个如您所述的NoSuchElementException。您要么需要在同一数据上有两个独立的迭代器,要么需要在while循环中进行另一次检查,以检查集合中是否还有剩余内容,然后再尝试将其取出。

最新更新