【问题标题】:Java iterator.hasNext() is always trueJava iterator.hasNext() 始终为真
【发布时间】:2015-12-05 00:15:05
【问题描述】:

我的代码有一点问题,如下所示。 iterator().hasNext() 永远不会变成 false,因为 next() 函数总是返回相同的元素。它以无限循环结束。

我想在集合中的每个元素中设置属性 UserLock(从GetElements() 返回)。 如果元素的类型是“包”,我会通过lockAllElements函数的递归调用来锁定包下的所有元素。

private void lockAllElements(String internalGUID) {
    Element tempElem = null;

    while((repo.GetPackageByGuid(internalGUID).GetElements().iterator().hasNext()) == true) {
        tempElem = repo.GetPackageByGuid(internalGUID).GetElements().iterator().next();

        if(tempElem.GetType().equals("Package")) {                
            this.lockAllElements(tempElem.GetElementGUID());
        }

        tempElem.ApplyUserLock(); 
    }
}

【问题讨论】:

    标签: java while-loop iterator


    【解决方案1】:

    这总是正确的,因为您在循环的每次迭代中都会获得一个新的 Iterator 实例。您应该获得一个 Iterator 实例并在整个循环中使用该实例。

    改变

    while((repo.GetPackageByGuid(internalGUID).GetElements().iterator().hasNext()) == true) {
        tempElem = repo.GetPackageByGuid(internalGUID).GetElements().iterator().next();
        ...
    

    Iterator<Element> iter = repo.GetPackageByGuid(internalGUID).GetElements().iterator();
    while(iter.hasNext()) {
        tempElem = iter.next();
        ...
    

    【讨论】:

      【解决方案2】:

      根据@Eran 的回答...我有时更喜欢for 循环:

      for (Iterator<Element> iter = repo.GetPackageByGuid(internalGUID).GetElements().iterator(); iter.hasNext(); ) {
          tempElem = iter.next();
      }
      

      【讨论】:

        猜你喜欢
        • 2019-02-01
        • 1970-01-01
        • 2016-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-23
        • 2021-01-07
        • 2014-07-17
        相关资源
        最近更新 更多