为什么当我尝试在此列表上使用迭代器时抛出此异常?
Why this exception is thrown when I try to use an iterator on this list?
我有一个 collection 这种类型的:
List<com.liferay.portal.model.Role> ruoli
ruoli = currentUser.getRoles();
包含 3 个元素(我使用调试器看到它),每个 Role object 都有一个 name 字段和previos 列表中的 3 object 名称如下:Administrator、Power User 和 User.
所以我尝试使用 迭代器 迭代此列表并打印包含在 [= 中的这 3 个 object 的名称字段的值37=]若离列表,所以我是这样做的:
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)'] ERROR commons.CommonsLogger.error(38) - 无法执行操作
java.util.NoSuchElementException
似乎在尝试执行此操作时抛出异常:
iteratorUserRoles.next();
为什么?可能是什么问题呢?我错过了什么?如何解决此问题并正确地将所有 object 迭代到我的列表中?
Tnx
您在每次迭代中将迭代器推进两次。
while (iteratorUserRoles.hasNext()) {
System.out.println(iteratorUserRoles.next().getName());
//iteratorUserRoles.next(); remove this
}
如果迭代器有一个剩余元素,并且您调用 iteratorUserRoles.next()
两次,您将得到一个异常。
Iterator#next()
不是 getter。它将指针和 returns 元素前移到新位置。
如果您需要触摸它两次,请将返回的值分配给一个变量:
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());
}
我有一个 collection 这种类型的:
List<com.liferay.portal.model.Role> ruoli
ruoli = currentUser.getRoles();
包含 3 个元素(我使用调试器看到它),每个 Role object 都有一个 name 字段和previos 列表中的 3 object 名称如下:Administrator、Power User 和 User.
所以我尝试使用 迭代器 迭代此列表并打印包含在 [= 中的这 3 个 object 的名称字段的值37=]若离列表,所以我是这样做的:
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)'] ERROR commons.CommonsLogger.error(38) - 无法执行操作 java.util.NoSuchElementException
似乎在尝试执行此操作时抛出异常:
iteratorUserRoles.next();
为什么?可能是什么问题呢?我错过了什么?如何解决此问题并正确地将所有 object 迭代到我的列表中?
Tnx
您在每次迭代中将迭代器推进两次。
while (iteratorUserRoles.hasNext()) {
System.out.println(iteratorUserRoles.next().getName());
//iteratorUserRoles.next(); remove this
}
如果迭代器有一个剩余元素,并且您调用 iteratorUserRoles.next()
两次,您将得到一个异常。
Iterator#next()
不是 getter。它将指针和 returns 元素前移到新位置。
如果您需要触摸它两次,请将返回的值分配给一个变量:
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());
}