Java - 增强型for循环永远不会结束

3

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

        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

发生了什么事?


10
friendSet是什么? - SLaks
7
让我们猜一下:friendSet 是您实现的 Iterable,而迭代器是您的 #iterator() 方法返回的,但它已经损坏了。 - Marko Topolnik
1
你能否发布一段代码,让我们在自己的电脑上重现你的问题?(在创建这段代码的过程中,你很有可能会自己找到问题的解决方法 :)) - Pshemo
1
作为测试,请使用传统的 for 循环等效方式,它应该表现出相同的行为:for (Iterator<String> i = friendSet.iterator(); i.hasNext(); ) { String element = i.next(); . . . } - Ted Hopp
3
你为什么不创建一个包含三个元素的集合并查看输出结果。无论如何,如果你想要一个真正的答案,请创建一个最小自给自足的代码示例(SSCCE)。 - Marko Topolnik
显示剩余4条评论
2个回答

1
幕后花絮:在Java中,foreach循环只使用对象iterator。 < p > friendSet是某种自定义可迭代集合吗?如果是这样,您的迭代器实现不正确。


除非是Guava的Iterables.cycle() :-) - Frank Pavageau
开玩笑的话不说,我怀疑 Iterables.cycle().size() 不会返回一个确定的数字。 - Marko Topolnik
@MarkoTopolnik 作为一个Iterable,它无论如何都没有size()方法。OP的friendSet至少是一个Collection。 - Frank Pavageau
私有静态集合 friendSet = new HashSet<String>(6000); 这是代码。它只是一个普通的集合。 - Qwertyfshag
@Qwertyfshag 你的 foreach 循环是否在另一个循环内部? - Colin D
@Colin 不是的,这个循环是独立的。 - Qwertyfshag

0

我的for循环所在的方法被调用了多次。谢谢大家的帮助。这是我自己的愚蠢错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接