You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加System.out.println()后Swing井字棋AI循环陷入无限

嘿,我来帮你捋捋这个无限循环的问题——毕竟做Swing游戏的时候,EDT和AI逻辑的坑我可踩过不少😅

可能触发无限循环的几个常见原因

  • 遍历集合时意外修改了集合本身:如果你的intersections是个动态集合(比如ArrayList),要是循环过程中不小心添加/移除了元素,迭代器就会一直有新元素可以遍历,直接导致循环停不下来。比如你在检查某个位置是否能结束游戏时,有没有间接修改了intersections的内容?虽然打印语句本身不会改集合,但说不定打印触发了某个UI相关的逻辑,间接改动了这个集合。
  • 循环条件的“动态陷阱”:要是你用的是for (int i = 0; i < intersections.size(); i++)这种循环,而每次循环时intersections.size()都在变大,那i永远追不上集合的大小,循环就会无限跑下去。这种情况建议先把集合转成固定大小的副本再遍历,比如提前存成数组或者新的ArrayList。
  • 递归调用引发的循环连锁:如果你的“判断游戏是否结束”的方法里,间接递归调用了这个遍历函数,就可能形成循环调用链,导致程序一直停不下来。

快速排查的小技巧

  1. 固定遍历的集合:在循环前把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:19:55