Java Can';t固定阵列索引边界外异常
我跟在后面。这个问题出现在视频的第6分钟。 我修改了视频中显示的一些变量 我创建了一个40x20映射,以便以后在初始化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,
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
}