为什么要为嵌套迭代器获取 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"?我有解决方案如何避免,但是我想知道为什么会引发异常。提前致谢

想想i4元素{1,2,3,4} nd 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

上面的代码在内部循环中有一个未经检查的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()));
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()。这就是您收到错误的原因。

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

最新更新