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

为何ArrayList长度异常变长?Java卡牌游戏索引越界问题求助

解决War卡牌游戏中的IndexOutOfBoundsException问题

嘿,别担心,作为Java新手遇到这种问题太正常了,而且你已经把问题描述得很清楚了👍。咱们来一步步拆解这个问题:

首先,你看到的Index: 17, Size: 17异常意思是:你尝试访问ArrayList的第17个索引(注意Java里列表索引是从0开始的),但这个列表当前只有17个元素——最大合法索引是16,所以访问17就会触发越界错误。

那为什么你的ArrayList会从预期的16张牌变成17张呢?常见的原因有两种:

1. 初始化时不小心多添加了元素

检查你生成牌的代码,是不是循环次数写错了?比如本来应该循环16次生成16张牌,但不小心写成了循环17次:

// 错误示例:i <=16会循环17次(0到16),生成17张牌
for (int i = 0; i <= 16; i++) {
    playerCards.add(random.nextInt(13) + 1);
}
// 正确应该是i <16,循环16次(0到15)
for (int i = 0; i < 16; i++) {
    playerCards.add(random.nextInt(13) + 1);
}

你可以在初始化完两个列表后,加一行System.out.println("Player1 cards size: " + player1.size());来确认初始大小是不是16。

2. 游戏逻辑中意外添加了额外元素

War游戏的规则里有平局时的特殊处理(比如双方各拿3张牌,再比第4张),如果这部分逻辑写得有问题,可能会不小心往列表里多添加了牌。比如:

  • 赢牌时重复添加了某张牌
  • 平局处理时错误地把额外的牌重复加入列表
  • 移除元素后添加的逻辑出错,导致元素数量净增加

建议你在触发异常的代码行前后,打印两个列表的大小,看看是在哪一步列表大小变成了17。比如如果是在处理回合的循环里,每次循环后都打印大小,就能定位到是哪一次操作让列表变大了。

另外要记住:ArrayList的get()方法不会自动扩容,只有当你调用add()(或addAll()这类方法)时才会增加元素数量,所以肯定是某处代码调用了这类方法导致大小超过了16。

慢慢来,先排查初始化代码,再检查游戏中的元素修改逻辑,应该很快就能找到问题啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:40:16