为什么当我尝试在此列表中使用迭代器时会抛出此异常



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

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

包含 3 个元素(我使用调试器看到它),每个 Role 对象都有一个名称字段,previos 列表中的 3 个对象具有以下名称管理员高级用户和用户

所以我

尝试使用迭代器来迭代这个列表,并打印包含在 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' 表示队列: 'weblogic.kernel.Default (self-tuning)'] ERROR 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() 不是 getter。它前进指针并在新位置返回元素。

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

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

最新更新