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"?我有解决方案如何避免,但是我想知道为什么会引发异常。提前致谢
想想i
有4
元素{1,2,3,4}
nd j
有5
元素{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() 语句。