【问题标题】:Java - Enhanced For Loop never endingJava - 增强的 For 循环永无止境
【发布时间】:2012-12-04 23:41:42
【问题描述】:

这段代码正在产生一个无限循环:

        for (String element : friendSet) {
        resultNum ++;
        System.out.println("  Result # " + resultNum + " = " + element);
        System.out.print(" friendSet.size() = " + friendSet.size());
    }

friendSet.size() = 2923 但结果不断攀升至数万,直到我强制程序停止。例如:

friendSet.size() = 2923  Result # 7652 = Charlie
friendSet.size() = 2923  Result # 7653 = Jamie
friendSet.size() = 2923  Result # 7654 = Smith

发生了什么事?

【问题讨论】:

  • 什么是friendSet
  • 让我们猜一下:friendSet 是您对 Iterable 的实现,而您的 #iterator() 方法返回的迭代器已损坏。
  • 您能否发布代码,让我们在我们的计算机上重现您的问题? (很有可能在创建该代码时您会自己解决问题:)
  • 作为测试,使用传统的 for 循环等效项,它的行为方式应该相同:for (Iterator<String> i = friendSet.iterator(); i.hasNext(); ) { String element = i.next(); . . . }
  • 你为什么不制作一组三个元素,看看打印了什么。无论如何,如果您想要一个真正的答案,请创建一个 SSCCE。

标签: java loops for-loop foreach


【解决方案1】:

幕后花絮:Java 中的 foreach 循环只使用对象 iterator

friendSet 是某种自定义的可迭代集合吗?如果是这样,您的迭代器实现不正确。

【讨论】:

  • 除非是 Guava 的 Iterables.cycle() :-)
  • @FrankPavageau 开个玩笑,我怀疑Iterables.cycle().size() 会返回一个确定的数字。
  • @MarkoTopolnik 作为一个 Iterable,它无论如何都没有 size() 方法。 OP 的friendSet 至少是一个集合。
  • 私有静态集合friendSet = new HashSet(6000);这是代码。这只是一个普通的集合。
  • @Qwertyfshag 您的 foreach 循环是否在另一个循环中?
【解决方案2】:

我的 for 循环所在的方法被多次调用。谢谢你们的帮助。我犯了愚蠢的错误。

【讨论】:

    猜你喜欢
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 2016-06-04
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多