2015-09-12 4 views
0

У меня проблема с индексированием массива. Предполагается, что код перемещает объекты типа Ant вокруг сетки 20x20.Исправлен указатель Out Of Bounds Exception

public class Test { 
    Organism[][] grid = new Organism[20][20]; 

    public static void main(String[] args) { 

     for (int i = 0; i < 20; i++){ 
      for (int j = 0; j < 20; j++){ 
       if(grid[i][j] instanceof Ant){ 
         int xpos = i; 
         int ypos = j; 
         grid[i][j].move(xpos, ypos); 
         grid[i][j].breed(xpos, ypos); 
       } 
      } 
     } 
} 

Класс Ant распространяется на организм, класс Организм расширяет тест.

public class Ant extends Organism{ 
    public void move(int xpos, int ypos){ 
    Random rand = new Random(); 
     int direction = rand.nextInt(3); 
     if(direction == 0){ 
      if(grid[xpos][ypos + 1] == null && xpos <20 && ypos <20) 
      { 
       grid[xpos][ypos] = grid[xpos][ypos]; 
       grid[xpos][ypos] = null; 
      { 
     } 
    } 
} 

Метод шаг должен выбрать случайное направление на сетке и переместить Ant там, если прилегающая пространство пусто. Он также не может выйти за пределы сетки 20x20. (Есть еще три петли для других направлений).

Если я изменяю шестую строчку в методе перемещения к:

if(grid[xpos][ypos] == null && xpos <20 && ypos <20) 

Тогда не выбрасывается никакая ошибка.

Я стесняюсь опубликовать это, потому что его, вероятно, небольшая ошибка с моей стороны, но я смотрел на это несколько часов.

Помощь с благодарностью.

ответ

0

Операнды для && оцениваются слева направо, и оценка останавливается, если один из них оценивает значение false. Поэтому, если один или несколько операндов потенциально опасны (например, поиск массива, который может выйти за рамки), а некоторые из других операндов должны защищать от этого, необходимо сначала выполнить операнды защиты. Кроме того, необходимо проверить показатели на самом деле вы используете, а именно xpos и ypos + 1, и вы забыли использовать ypos + 1 в задании, что движется муравей:

if (xpos < 20 && ypos + 1 < 20 && grid[xpos][ypos + 1] == null) { 
    grid[xpos][ypos + 1] = grid[xpos][ypos]; 
    grid[xpos][ypos] = null; 
} 

(И, если предположить, что xpos и ypos действительны индексы, вам не нужно проверять xpos.)

+0

Это все еще дает мне ошибку. – newjersian1

+0

Вы сделали аналогичные изменения в других 'if's? На какой строке выбрано исключение, и каково сообщение? –

+0

Кстати, это определенно сбой в 'main()', потому что вы сначала перемещаете муравей из своей исходной ячейки, а затем пытаетесь развить ту же ячейку (которая теперь пуста). –