![](/img/trans.png)
[英]Why an exception is thrown when removing an item via iterator while running over the list?
[英]Why this exception is thrown when I try to use an iterator on this list?
我有此類型的集合:
List<com.liferay.portal.model.Role> ruoli
ruoli = currentUser.getRoles();
其中包含3個元素(我使用調試器看到它),每個Role對象都有一個name字段,而previos列表中的3個對象有以下名稱: Administrator , Power User和User 。
因此,我嘗試使用迭代器在此列表上進行迭代,並打印包含在ruoli列表中的這3個對象的名稱字段的值,因此我采用這種方式:
Iterator<Role> iteratorUserRoles = ruoli.iterator();
while (iteratorUserRoles.hasNext()) {
System.out.println(iteratorUserRoles.next().getName());
iteratorUserRoles.next();
}
問題是它不顯示
但是在stacktrace中,我獲得了:
**Administrator**
**Power User**
**User**
如我所料,但我收到此消息:
**Administrator**
**User**
然后拋出此異常:
2015-01-26 10:20:13,071 [[ACTIVE] ExecuteThread:'1'表示隊列:'weblogic.kernel.Default(自我調整)']錯誤commons.CommonsLogger.error(38)-無法執行動作java .util.NoSuchElementException
似乎在嘗試執行此操作時拋出了異常:
iteratorUserRoles.next();
為什么? 可能是什么問題呢? 我在想什么 如何解決此問題並正確迭代列表中的所有對象?
特納克斯
您在每次迭代中都將迭代器前進兩次。
while (iteratorUserRoles.hasNext()) {
System.out.println(iteratorUserRoles.next().getName());
//iteratorUserRoles.next(); remove this
}
如果迭代器還有一個剩余元素,並且您兩次調用iteratorUserRoles.next()
,則會得到一個異常。
Iterator#next()
不是吸氣劑。 它使指針前進並在新位置返回元素。
如果需要觸摸兩次,則將返回的值分配給變量:
Iterator<Role> iteratorUserRoles = ruoli.iterator();
while (iteratorUserRoles.hasNext()) {
Role role = iteratorUserRoles.next();
System.out.println(role.getName());
// do something else with role
}
您在while循環中兩次調用iterator.next()。 這就是為什么您會獲得異常(以及為什么錯過第二個元素)的原因
但是,我建議您不要以這種方式訪問迭代器。 像這樣在for循環中使用它的機制。
for (com.liferay.portal.model.Role role : ruoli){
System.out.println(role.getName());
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.