1

私はこのタイプのコレクションを持っています:

List<com.liferay.portal.model.Role> ruoli
ruoli = currentUser.getRoles(); 

これには 3 つの要素が含まれており (デバッガーを使用して確認できます)、各Roleオブジェクトには名前フィールドがあり、前のリストの 3 つのオブジェクトには次の名前があります: AdministratorPower User、およびUser

したがって、イテレータを使用してこのリストを反復処理し、 ruoliリストに含まれるこれら 3 つのオブジェクトの名前フィールドの値を出力しようとしているので、次のようにします。

Iterator<Role> iteratorUserRoles = ruoli.iterator();

while (iteratorUserRoles.hasNext()) {
    System.out.println(iteratorUserRoles.next().getName());
    iteratorUserRoles.next();
}

問題はそれが表示されないことです

しかし、私が得るスタックトレースで:

**Administrator**
**Power User**
**User**

期待どおりですが、次のメッセージが表示されます。

**Administrator**
**User**

そして、この例外をスローします:

2015-01-26 10:20:13,071 [[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'] エラー commons.CommonsLogger.error(38) - アクション Java を実行できませんでした.util.NoSuchElementException

この操作を実行しようとすると、例外がスローされるようです。

iteratorUserRoles.next();

なんで?何が問題なのですか?私は何が欠けていますか?この問題を修正して、リスト内のすべてのオブジェクトを正しく反復処理するにはどうすればよいですか?

TNX

4

3 に答える 3

1

Iterator#next()ゲッターではありません。ポインターを進め、新しい位置にある要素を返します。

変数に 2 回触れる必要がある場合は、返された値を変数に割り当てます。

Iterator<Role> iteratorUserRoles = ruoli.iterator();

while (iteratorUserRoles.hasNext()) {
    Role role = iteratorUserRoles.next();
    System.out.println(role.getName());
    // do something else with role
}
于 2015-01-26T09:27:13.930 に答える
1

while サイクルで iterator.next() を 2 回呼び出しています。それが例外を取得する理由です(そして2番目の要素を見逃す理由です)

ただし、この方法でイテレータにアクセスしないことをお勧めします。このメカニズムを for ループで使用します。

for (com.liferay.portal.model.Role role : ruoli){
    System.out.println(role.getName());
}
于 2015-01-26T09:28:03.323 に答える