2D数组和越界异常

时间:2013-07-05 15:02:27

标签: java multidimensional-array

最后一个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);

     }
}

8 个答案:

答案 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 70 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);