数组出界但我不确定为什么?

时间:2013-08-01 00:16:21

标签: java arrays

所以这是我使用

的双数组
public int[][] MAP = { { 8, 9, 9, 8, 8, 8, 8, 8, 8, 8, 8 },
        { 8, 8, 9, 9, 8, 8, 8, 8, 8, 8, 8 },
        { 8, 8, 8, 9, 8, 8, 8, 8, 8, 8, 8 },
        { 8, 8, 8, 9, 9, 8, 8, 8, 8, 8, 8 },
        { 8, 8, 8, 8, 9, 8, 8, 8, 8, 8, 8 },
        { 8, 8, 8, 9, 9, 9, 8, 8, 8, 8, 8 },
        { 8, 8, 9, 9, 9, 8, 8, 8, 8, 8, 8 },
        { 8, 8, 8, 9, 9, 9, 8, 8, 8, 8, 8 },
        { 8, 8, 8, 8, 8, 9, 9, 9, 9, 8, 8 },
        { 8, 8, 8, 8, 8, 9, 9, 9, 8, 8, 8 },
        { 9, 8, 8, 8, 8, 8, 9, 9, 9, 8, 8 },
        { 9, 8, 8, 8, 8, 8, 9, 9, 9, 8, 8 },
        { 9, 8, 8, 8, 8, 8, 9, 9, 9, 8, 8 },
        { 9, 8, 8, 8, 8, 8, 9, 9, 9, 8, 8 },
        { 9, 8, 8, 8, 8, 8, 9, 9, 9, 8, 8 } };

我的问题是,当我尝试使用它来加载相应的图像时,我得到一个错误,表示当y = 12时它超出范围。

Image[][] displayedMap = new Image[MAP[0].length][MAP.length];

    public Town() {
        System.out.println("Map len" + MAP.length);
        for (int x = 0; x < MAP[0].length; x++) {
            for (int y = 0; y < MAP.length; y++) {
                System.out.println("X:" + x + ",Y:" + y);
                setImageContent(x, y);
            }
        }
    }

    private void setImageContent(int x, int y) {
        Terrain t = Terrain.getTerrainFor(MAP[x][y]);
        displayedMap[x][y] = t.getImage();
    }

当y在城镇构造函数中变为11时,然后转到它所说的setImagecontent

  

线程“AWT-EventQueue-0”中的异常   java.lang.ArrayIndexOutOfBoundsException:11

5 个答案:

答案 0 :(得分:5)

您的阵列尺寸已经交换,在您使用Y轴的“X轴”尺寸时,反之亦然

答案 1 :(得分:2)

您只有一个数组列长度为11,但行长度为15.您已经翻转了数组引用,因此行和列的长度不同会产生异常。

请改为尝试:

Image[][] displayedMap = new Image[MAP[0].length][MAP.length];
public Town() {
    System.out.println("Map len" + MAP.length);
    for (int x = 0; x < MAP.length; x++) {
        for (int y = 0; y < MAP[0].length; y++) {
            System.out.println("X:" + x + ",Y:" + y);
            setImageContent(x, y);
        }
    }
}

private void setImageContent(int x, int y) {
    Terrain t = Terrain.getTerrainFor(MAP[x][y]);
    displayedMap[x][y] = t.getImage();
}

注意我现在使用MAP.length作为xMAP[0].length的限制作为y的限制。

你刚刚翻过你的x和y。 X是行数,Y是列数。

我可能还建议您查看Tiled。这是一种更简单的方法。不再需要手工编写平铺地图到源文件!在一个不错的程序中编辑它们,然后只需解析数据文件。有许多不同的格式和解析器。

答案 2 :(得分:1)

这是应该创建displayedMap数组的方法:

Image[][] displayedMap = new Image[MAP.length][MAP[0].length];

在您的代码中,尺寸会反转。

答案 3 :(得分:0)

for (int x = 0; x < MAP.length; x++) {
   for (int y = 0; y < MAP[0].length; y++) {

    }
}

MAP.length是行数。 MAP[0].length是该行中的列数。

答案 4 :(得分:0)

我习惯于在使用二维数组时反转x和y,即我通过MAP[y][x]访问它们:首先访问“行”(内部数组),然后访问“列” (内部数组中的项目)。

如果你经常犯错误,请使用“包含更多盒子的盒子”而不是单个“矩阵”。