簡體   English   中英

當我嘗試在此列表上使用迭代器時,為什么會引發此異常?

[英]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個對象有以下名稱: AdministratorPower UserUser

因此,我嘗試使用迭代器在此列表上進行迭代,並打印包含在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM