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

Someone please explain why am i getting "NoSuchElementException" for these lines of code? I have solution how to avoid, however i want to know why exception thrown. Thanks in advance

4

4 回答 4

1

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

当您迭代内部循环直到d带有迭代器的元素时,j它会很好,因为迭代器i还具有 4 次迭代的元素,其中 j 有另一个元素被调用'e',因此j.hasnext将通过条件,但您i.next在内部循环内部调用而没有检查任何hasnext(). 在那里它会抛出 no such element 异常,因为之后 i 不包含任何元素。

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
于 2013-09-19T13:06:19.827 回答
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()));
于 2013-09-19T13:10:25.843 回答
-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.next() 之前不检查 i.hasNext() 是否。这就是您收到错误的原因。

于 2013-09-19T12:59:21.917 回答
-1

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

于 2013-09-19T13:20:31.503 回答