2D-массив и исключение за пределами

Вопрос:

Последний цикл цикла будет скомпилирован, но он не будет запущен. В нем указано, что исключение индекса массива за пределы: 17. Я просто хочу добавить ColorRectangles (подкласс ColorShape) в 1-8 столбцов в 17-й строке

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);

}
}

Лучший ответ:

Размер вашего массива — 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);

Ничего, да?

Ответ №1

Эта:

_tiles[j][17] = new ColorRectangle(Color.BLACK);

17 не является допустимым индексом для вашего массива, так как вы оценили его как [8][17]. Индексы от 0...length - 1, поэтому в вашем случае до 16. Это потому, что массивы на Java (и любой разумный язык программирования) индексируются с нулевой отметкой. Таким образом, замените

_tiles[j][16] = new ColorRectangle(Color.BLACK);

и по крайней мере вы не получите ArrayIndexOutOfBoundsException.

Я просто хочу добавить ColorRectangles (подкласс ColorShape) в 1-8 столбцов в 17-й строке

См. В схеме индексации на основе нуля, 17-я строка — это строка с индексом 16.

Первая строка соответствует значению с индексом 0. Вторая строка соответствует значению с индексом 1. И т.д. В общем случае nth строка соответствует nth с индексом n - 1 а строка с индексом n фактически является (n + 1)th строке (при условии, что 0 <= n < length - 1).

Ответ №2

Ваша проблема здесь:

_tiles[j][17] = new ColorRectangle(Color.BLACK);

Вы должны иметь это вместо этого (обратите внимание, что массивы нуль-индексируются, поэтому 17-й столбец имеет индекс 16):

_tiles[j][16] = new ColorRectangle(Color.BLACK);

Ответ №3

В 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

Длина вашего массива равна [8][17] но индексы идут от [0] до [16]. Для этого замените

_tiles[j][17] = new ColorRectangle(Color.BLACK);

с

_tiles[j][16] = new ColorRectangle(Color.BLACK);

Ответ №5

Вы объявляете свой массив с 8 полями в диапазоне x и 17 полями в вашем диапазоне:

 _tiles = new ColorShape[8][17];

Поскольку вы начинаете отсчет с нуля в ИТ, диапазон от нуля до шестнадцати (0-16).
Поэтому, если вы хотите получить последнее поле массива, вы должны использовать поле 16 (_tiles[j][16]).

Код должен быть:

_tiles[j][16] = new ColorRectangle(Color.BLACK);

Все это называется нулевым номером/индексом.

Ответ №6

Согласно JLS (доступ к массиву)All arrays are 0-origin. An array with length n can be indexed by the integers 0 to n-1. 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

У вас может также быть ошибка для первого цикла.
Вместо
for (int я = 0; i<16; i++)
должен быть
for (int я = 0; i<17; i++)

Массивы с нулевым индексом означают, что начальный индекс равен 0 до длины-1.

Таким образом, в вашем случае это до 16.

Для вашего второго цикла это должно быть

_tiles[j][16] = new ColorRectangle(Color.BLACK);

Оцените статью
TechArks.Ru
Добавить комментарий