添加System.out.println()后Swing井字棋AI循环陷入无限
嘿,我来帮你捋捋这个无限循环的问题——毕竟做Swing游戏的时候,EDT和AI逻辑的坑我可踩过不少😅
可能触发无限循环的几个常见原因
- 遍历集合时意外修改了集合本身:如果你的
intersections是个动态集合(比如ArrayList),要是循环过程中不小心添加/移除了元素,迭代器就会一直有新元素可以遍历,直接导致循环停不下来。比如你在检查某个位置是否能结束游戏时,有没有间接修改了intersections的内容?虽然打印语句本身不会改集合,但说不定打印触发了某个UI相关的逻辑,间接改动了这个集合。 - 循环条件的“动态陷阱”:要是你用的是
for (int i = 0; i < intersections.size(); i++)这种循环,而每次循环时intersections.size()都在变大,那i永远追不上集合的大小,循环就会无限跑下去。这种情况建议先把集合转成固定大小的副本再遍历,比如提前存成数组或者新的ArrayList。 - 递归调用引发的循环连锁:如果你的“判断游戏是否结束”的方法里,间接递归调用了这个遍历函数,就可能形成循环调用链,导致程序一直停不下来。
快速排查的小技巧
- 固定遍历的集合:在循环前把
intersections复制成一个固定的集合,避免遍历过程中原集合被修改:
// 先做个副本,隔离原集合的动态变化 List<Position> fixedIntersections = new ArrayList<>(intersections); for (Position pos : fixedIntersections) { // 你的原有逻辑+打印语句 }
如果这样就不循环了,那肯定是原集合在遍历过程中被修改了,接下来就找哪里改了这个集合就行。
2. 加个循环计数器调试:在循环里加个计数器,打印循环次数和当前处理的位置,快速定位问题类型:
int loopCount = 0; for (Position pos : intersections) { loopCount++; System.out.println("第" + loopCount + "次循环,当前位置:" + pos); // 你的原有逻辑 }
通过这个输出,你能立刻知道是循环卡在某个位置,还是集合一直在新增元素。
3. 检查“可用位置”的判断逻辑:是不是你的代码错误地把已经被占用的位置也算进了intersections?或者游戏结束的判断逻辑有问题,导致一直认为还有可用位置,让循环永远跑下去?
内容的提问来源于stack exchange,提问作者Vladimir Louis
相关产品推荐
相关产品推荐

