1

我有一个这种类型的集合:

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

包含 3 个元素(我使用调试器看到它​​),每个Role对象都有一个name字段,并且 previos 列表中的 3 个对象具有以下名称:AdministratorPower UserUser

所以我试图使用一个迭代器来迭代这个列表并将这3个对象的名称字段的值打印到ruoli列表中,所以我这样做:

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();

为什么?可能是什么问题呢?我错过了什么?如何解决此问题并正确地将所有对象迭代到我的列表中?

肿瘤坏死因子

4

3 回答 3

5

您在每次迭代中推进迭代器两次。

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

如果迭代器有一个剩余元素并且你调用iteratorUserRoles.next()了两次,你会得到一个异常。

于 2015-01-26T09:24:27.390 回答
1

Iterator#next()不是吸气剂。它使指针前进并返回新位置的元素。

如果您需要触摸两次,则将返回的值分配给变量:

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() 两次。这就是为什么你会得到例外(以及为什么你会错过第二个元素)

但是,我建议您不要以这种方式访问​​迭代器。像这样在 for 循环中使用它的机制。

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