最后一个for循环将编译,但不会运行。它表示数组索引超出范围异常:17。我只想将ColorRectangles(ColorShape的子类)添加到第17行的1-8列
private ColorShape[][] _tiles;
public GamePanel()
{
_tiles = new ColorShape[8][17];
for (int i = 0; i<16; i++){
for(int j=0; j<8;j++){
_tiles[j][i] = null;
}
}
for (int j=0; j<8;j++){
_tiles[j][17] = new ColorRectangle(Color.BLACK);
}
}
答案 0 :(得分:0)
此:
_tiles[j][17] = new ColorRectangle(Color.BLACK);
17不是数组的有效索引,因为您将其调整为[8][17]
。索引来自0...length - 1
,因此在您的情况下,最多16个。这是因为Java(以及任何合理的编程语言)中的数组是zero-indexed。因此,替换为
_tiles[j][16] = new ColorRectangle(Color.BLACK);
至少你不会得到ArrayIndexOutOfBoundsException
。
我只是想将ColorRectangles(ColorShape的子类)添加到第17行的1-8列
在基于零的索引方案中,请参见第17行 索引为16的行。
第一行对应于索引为0.第二行对应于索引为1.等等。通常,nth
行对应于索引n - 1
的行和带索引的行n
实际上是(n + 1)th
行(假设为0 <= n < length - 1
)。
答案 1 :(得分:0)
你的问题在这里:
_tiles[j][17] = new ColorRectangle(Color.BLACK);
你应该这样做(注意数组是零索引的,所以第17列是索引16):
_tiles[j][16] = new ColorRectangle(Color.BLACK);
答案 2 :(得分:0)
您的数组大小为17.数组是零索引的。这意味着您的第二个维度的最大数组索引实际上是16,而不是17。
将您对瓷砖的引用更改为:
_tiles[j][16] = new ColorRectangle(Color.BLACK);
或者让你的_tiles数组更大:
_tiles = new ColorShape[8][18];
要么解决这个问题。
我还建议您的游戏面板对象接受2个尺寸,宽度和高度。如果您决定再次使用它或更改其尺寸,这会使您的类更有用。在适当的时候避免使用硬编码值。这是最合适的。
这是你的重写:
private ColorShape[][] _tiles;
public GamePanel(int width, int height)
{
_tiles = new ColorShape[width][height];
for (int i = 0; i<height; i++){
for(int j=0; j<width;j++){
_tiles[j][i] = null;
}
}
for (int j=0; j<width;j++){
_tiles[j][tiles[j].length-1] = new ColorRectangle(Color.BLACK);
}
}
以下是您在案例中的使用方法:
GamePanel panel = new GamePanel(8, 17);
但您现在可以随时轻松更改面板尺寸!
GamePanel panel = new GamePanel(100,100);
Nifty呵呵?
答案 3 :(得分:0)
在java中,索引从零(0)开始;
private ColorShape[][] _tiles;
public GamePanel()
{
_tiles = new ColorShape[8][18]; // new dim is 18 so last index is 17
for (int i = 0; i<18; i++){
for(int j=0; j<8;j++){
_tiles[j][i] = null;
}
}
for (int j=0; j<8;j++){
_tiles[j][17] = new ColorRectangle(Color.BLACK); //17 was out of bounds
}
}
答案 4 :(得分:0)
数组的长度为[8][17]
,但索引从[0]
转到[16]
。
因此替换
_tiles[j][17] = new ColorRectangle(Color.BLACK);
与
_tiles[j][16] = new ColorRectangle(Color.BLACK);
答案 5 :(得分:0)
您在代码中声明您的数组包含x范围内的8个字段和y范围内的17个字段:
_tiles = new ColorShape[8][17];
因为您从IT开始从零开始计数,所以范围从0到16(0-16
)。
因此,如果您想要数组的最后一个字段,则必须使用字段16(_tiles[j][16]
)。
代码应为:
_tiles[j][16] = new ColorRectangle(Color.BLACK);
整个事情被称为zero-based-numbering/index。
答案 6 :(得分:0)
根据JLS
(Array Access) - All arrays are 0-origin. An array with length n can be indexed by the integers 0 to n-1.
因此,如果您像_tiles = new ColorShape[8][17];
那样初始化数组。要访问,您需要0 to 7
和0 to 16
。
现在,使用_tiles[j][17] = new ColorRectangle(Color.BLACK);
,您尝试访问的内容超出了已初始化的数组,因此您获得了java.lang.ArrayIndexOutOfBoundsException
。
答案 7 :(得分:0)
您可能还有第一个循环的错误
而不是
for (int i = 0; i<16; i++)
它应该是
for (int i = 0; i<17; i++)
数组为零索引,意味着起始索引为0到长度为-1。
因此,在您的情况下,它最多为16。
对于你的第二个循环,它应该是
_tiles[j][16] = new ColorRectangle(Color.BLACK);