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
相关产品推荐
相关产品推荐

