Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';t固定阵列索引边界外异常_Java_Exception - Fatal编程技术网

Java Can';t固定阵列索引边界外异常

Java Can';t固定阵列索引边界外异常,java,exception,Java,Exception,我跟在后面。这个问题出现在视频的第6分钟。 我修改了视频中显示的一些变量 我创建了一个40x20映射,以便以后在初始化TileGrid时使用它 int[][] map = { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0,

我跟在后面。这个问题出现在视频的第6分钟。 我修改了视频中显示的一些变量

我创建了一个40x20映射,以便以后在初始化
TileGrid
时使用它

int[][] map = {
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
            {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
    };
我初始化了
TileGrid
,并将整数二维数组
map
作为参数传递

TileGrid grid = new TileGrid(map);
TileGrid
的构造函数如下所示:

public Tile[][] map;
// Determines how many tiles can fit in the screen, in total it can fit 40x20 tiles.
// Artist.WIDTH is the window's width and Artist.HEIGHT is the window's height.
private int tilesAX = Artist.WIDTH / Tile.DEFAULT_TILE_WIDTH;
private int tilesAY = Artist.HEIGHT / Tile.DEFAULT_TILE_HEIGHT;

public TileGrid(int[][] newMap)
{
    map = new Tile[tilesAX][tilesAY];
    for(int i = 0; i < map.length; i++)
    {
        for(int j = 0; j < map[i].length; j++)
        {
            if(newMap[i][j] == 0)
                map[i][j] = new Tile(i * Tile.DEFAULT_TILE_WIDTH, j * Tile.DEFAULT_TILE_HEIGHT, Tile.DEFAULT_TILE_WIDTH, Tile.DEFAULT_TILE_HEIGHT, TileType.Grass);
            else
                map[i][j] = new Tile(i * Tile.DEFAULT_TILE_WIDTH, j * Tile.DEFAULT_TILE_HEIGHT, Tile.DEFAULT_TILE_WIDTH, Tile.DEFAULT_TILE_HEIGHT, TileType.Dirt);
        }
    }
}

我不确定我提供的信息量是否足以解释这个问题。我试着解释一切。提前感谢。

在循环中,数组的上界是map.length-1

for(int i = 0; i < map.length; i++) {
    // do something
}
for(int i=0;i

for(int j=0;j

上限应该是map.length-1和map[i].length-1

最好的答案是丑陋的代码也经常被破坏。代码假定
newMap
map
具有相同的大小,或者更准确地说,
newMap
map
更大(更多行和更多列)

事实并非如此,原因有很多:

  • map
    的大小是在运行时计算的,而
    newMap
    的大小是硬编码的。如果将其替换为
    new int[40][20]
    ,则仍然存在此问题,并且每当
    map
    在不同的运行时上下文中具有不同的大小时,它就会中断

  • 您以为您正在实例化一个40x20数组,但它是一个20x40数组


所有这些导致了一个结论:了解你的语言,了解它的结构,一旦你意识到你正在做一项愚蠢而无聊的任务,比如手工(或复制粘贴)填充800个元素的数组,问问自己是否有更好的方法。tilesAX和tilesAY显然比预定义的40x20地图要大。我以为编程就是让计算机完成你不想做的工作。就像实例化一个包含800个元素的矩阵一样,@VicenteBermúdez步骤1是找到一个不同的“教程”。@VicenteBermúdez那么你应该做得比教程更好。你甚至不知道你是否计算好了行数和列数。它就像
new int[40][20]
那么简单,顺便说一下,矩阵是20x40,而不是40x20。我想你的意思是
j
而不是
i
在你的第二个循环中。谢谢你纠正了这一点,这是我的错,我只是复制并粘贴了第一个循环:你不应该显示两个明显不相关的代码段。我想你的意思是让第二个循环成为第一个循环的内环嗯,为什么????此代码使用

if(newMap[i][j] == 0)
for(int i = 0; i < map.length; i++) {
    // do something
}
for(int j = 0; j < map[i].length; j++){
    // do something
}