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”?我有解决方案如何避免,但我想知道为什么抛出异常。提前致谢
答案 0 :(得分:1)
考虑i
有4
个元素{1,2,3,4}
和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
答案 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()语句。