为什么为嵌套的Iterator获取NoSuchElementException

时间:2013-09-19 12:56:21

标签: java iterator nosuchelementexception

for(Iterator<Suit> i = suits.iterator(); i.hasNext();)
          for(Iterator<Rank> j = ranks.iterator(); j.hasNext();)
            deck.add(new Card(i.next(), j.next()));

有人请解释为什么我会为这些代码行获得“NoSuchElementException”?我有解决方案如何避免,但我想知道为什么抛出异常。提前致谢

4 个答案:

答案 0 :(得分:1)

考虑i4个元素{1,2,3,4}j5个元素{a,b,c,d,e}

当您使用迭代器d迭代内部循环直到j的元素时,它将没有问题,因为迭代器i也具有4次迭代的元素,其中j具有另一个迭代名为'e'的元素,因此j.hasnext将传递条件,但您在内部循环内调用i.next而不检查任何hasnext()。在那里它会抛出没有这样的元素异常,因为我之后不包含任何元素。

1st iteration : j - > a and i -> 1
       j.hasnext() -> true -> j.next and i.next
2nd iteration : j -> b and i -> 2
       j.hasnext() -> true -> j.next and i.next
3rd iteration : j -> c and i -> 3
       j.hasnext() -> true -> j.next and i.next 
4th iteration : j -> d and i -> 4
       j.hasnext() -> true -> j.next and i.next throws exception

答案 1 :(得分:0)

上面的代码在内部循环中有一个未经检查的i.next()。我不是特别确定,无论是有意还是无意,但如果它是有意的,则不需要嵌套循环,只需要循环迭代两个循环:

Iterator<Suit> i = suits.iterator();
for(Iterator<rank> j = ranks.iterator(); j.hasNext();)
    if(i.hasNext())
       deck.add(new Card(i.next(), j.next()));

答案 2 :(得分:-1)

for(Iterator<Suit> i = suits.iterator(); i.hasNext();){
          Suit tmp = i.next();
          for(Iterator<Rank> j = ranks.iterator(); j.hasNext();)
            deck.add(new Card(tmp, j.next()));
}

这应该解决它。你在内部循环中调用了i.next()。这不是我认为你打算做的事情。

在你的代码中,在内部循环中你不检查i.hasNext()是否正在调用i.next()。这就是你收到错误的原因。

答案 3 :(得分:-1)

您只需检查j.hasNext();即可停止for循环。所以你必须添加i.hasnext()语句。