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

Java中ArrayList打印size非0但while循环判定其size为0的问题

问题根因与修复方案

1. 核心循环逻辑错误

你当前的while循环使用了**逻辑或||**作为判断条件,完全不符合战斗逻辑需求:只要任意一方还有存活单位,循环就会继续执行,就算怪物已经全灭,只要骑士还有剩余,循环会一直空转甚至抛出空指针异常。
正确的战斗循环判断逻辑应为「双方都有存活单位时才继续战斗」,修改为逻辑与&&即可:

// 修改前
while ((baddies.size() > 0) || (goodies.size() > 0)) {
// 修改后
while ((baddies.size() > 0) && (goodies.size() > 0)) {

2. IDE提示baddies.size()始终为0修复方案

IDE静态分析判定该值恒为0,说明getRandomMonsters()方法的实现存在静态可识别的问题:

  • 检查该方法所有返回分支,确认是否存在未填充元素就返回空列表的分支
  • 确认方法返回的不是被其他逻辑提前清空的列表对象
  • 如果存在多线程操作该列表的场景,加同步锁避免并发修改导致的列表状态异常

3. 打印size正常但判断失效修复方案

如果运行时打印baddies.size()数值正常,但条件判断不生效,是goodTurn/badTurn方法中操作列表的逻辑有误:

  • Java为值传递,如果你在方法内对参数baddies直接重新赋值(比如写了baddies = new ArrayList<>()这类代码),只会修改方法内的局部变量引用,不会影响方法外的baddies列表
  • 确认你删除列表元素时调用的是remove()等直接修改原列表的方法,而不是操作了列表的副本

4. 额外隐性漏洞修复

你当前goodies直接引用了data.activeKnights全局对象,后续对goodies的修改会直接修改全局骑士数据,如果不需要同步修改全局数据,建议做一次浅拷贝隔离副作用:

ArrayList<Knight> goodies = new ArrayList<>(data.activeKnights);

内容的提问来源于stack exchange,提问作者Alex Korobeiniki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 02:30:02