Java文字RPG三维tile数组遍历出现下标越界错误该如何解决?
问题根因
你定义的三维int数组中,最内层的所有子数组都使用空大括号{}初始化,这意味着tiles[楼层][行]对应的一维数组长度为0,当你尝试访问tiles[0][i][j]时,本质是对长度为0的数组执行下标取值操作,自然会抛出Index 0 out of bounds for length 0的越界异常。
修复方案
根据你的业务需求可以选择以下两种修复方式:
方案1:简化为二维数组(更适配你的场景)
从注释的坐标标注、以及只需要存单个地砖类型值的需求来看,你其实不需要三维数组,直接使用7x7的二维数组即可:
// 定义7行7列的二维地砖数组,初始化后每个位置默认值为0 private int[][] tiles = new int[7][7];
对应的遍历逻辑调整为:
public void create_grid() { boolean door_set = false; for (int i = 0; i < 7; i++) { for (int j = 0; j < 7; j++) { if (tiles[i][j] != 2) { tiles[i][j] = d1.tile_spawn(); } } } }
方案2:保留三维数组,补全初始化逻辑
如果你确实需要使用三维数组(比如第一层存房间ID、图层ID等),只需要给最内层数组分配对应的存储空间即可:
// 第一层长度7(比如对应7个房间),每个房间为7行7列网格,每个网格存1个地砖类型值 private int[][][] tiles = new int[7][7][1];
如果要沿用你原来的静态初始化写法,把所有空的{}替换为{0}即可:
private int[][][] tiles = { /* 0,0 0,1 0,2 0,3 0,4 0,5 0,6 */ { {0}, {0}, {0}, {0}, {0}, {0}, {0} }, /* 其余行按相同格式替换内层空括号即可 */ ... };
优化建议
建议后续循环时使用数组本身的length属性控制边界,避免后续调整数组大小时还需要同步修改循环硬编码值:
// 三维数组场景的循环写法示例 for (int i = 0; i < tiles[0].length; i++) { for (int j = 0; j < tiles[0][i].length; j++) { if (tiles[0][i][j] != 2) { tiles[0][i][j] = d1.tile_spawn(); } } }
内容的提问来源于stack exchange,提问作者Keir Hewitt
相关产品推荐
相关产品推荐

