【问题标题】:Why this exception is thrown when I try to use an iterator on this list?当我尝试在此列表上使用迭代器时,为什么会引发此异常?
【发布时间】:2015-03-24 16:56:03
【问题描述】:

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

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

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

所以我尝试使用 iterator 来迭代这个列表并将这 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();

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

Tnx

【问题讨论】:

    标签: java list iterator java-collections-api


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      Iterator<Role> iteratorUserRoles = ruoli.iterator();
      
      while (iteratorUserRoles.hasNext()) {
          Role role = iteratorUserRoles.next();
          System.out.println(role.getName());
          // do something else with role
      }
      

      【讨论】:

        【解决方案3】:

        您在 while 循环中调用了 iterator.next() 两次。这就是为什么你会得到异常(以及为什么你会错过第二个元素)

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

        for (com.liferay.portal.model.Role role : ruoli){
            System.out.println(role.getName());
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-01-03
          • 1970-01-01
          • 2017-03-19
          • 1970-01-01
          • 1970-01-01
          • 2021-03-08
          • 2013-11-08
          相关资源
          最近更新 更多