2013-04-26 3 views
0

Этот метод должен определить, закончилась ли игра или нет изначально и после некоторых ходов.Индекс массива за пределами границ?

public boolean isGameOver() { 
    Point[] player1 = new Point[12]; 
    int p1 = 0; 
    Point[] player2 = new Point[12]; 
    int p2 = 0; 
    for (int i = 0; i < 7; i++) { 
     for (int j = 0; j < 7; j++) { 
      if (board[i][j] == 1) { 
       Point p = new Point(i, j); 
       player1[p1] = p; 
       p1++; 
       //System.out.println(p.getX()+ " 1 " + p.getY()); 
      } else if (board[i][j] == 2) { 
       Point p = new Point(i, j); 
       player2[p2] = p; 
       p2++; 
       //System.out.println(p.getX()+ " 2 " + p.getY()); 
      } 
     } 
    } 
    for(int i1=0;i1<player1.length;i1++) { 
     ArrayList<Point> temp = getPossibleMoves(player1[i1]); 
     if(temp.isEmpty()) 
      return true; 
    } 
    for(int i1=0;i1<player1.length;i1++) { 
     ArrayList<Point> temp = getPossibleMoves(player2[i1]); 
     if(temp.isEmpty()) 
      return true; 
    } 
    return false; 
} 

Проблема заключается в том, когда я запустить эти тесты они оба имеют ошибку индекса массива за пределы Те испытания

первоначально:

@Test(timeout=1000) 
public void testGameOverInitial() { 
    assertFalse(board.isGameOver()); 
} 

после нескольких ходов:

@Test(timeout=1000) 

public void testGameOverAfterSomeMoves() { 
    board.move(new Point(1, 0), new Point(3, 2)); // White's turn 
    board.move(new Point(0, 5), new Point(2, 5)); // Black's turn 
    assertFalse(board.isGameOver()); 
} 
+0

Где ошибка? Если я прочитаю это право, это будет один из способов доступа к 'board [i] [j]', который мы не видим инициализированным. – PaulProgrammer

+0

@PaulProgrammer ArrayIndexOutOfBoundException, как указано в заголовке. –

+0

Да, но на какой линии? Мой вопрос: WHERE, а не WHAT – PaulProgrammer

ответ

1

С p1 и p2 вложены в for петель, они может увеличиться до 49 вместо 12, что является размером обоих ваших игровых массивов.

Вы можете либо проверить длину p1, если она меньше, чем player1.length, как предлагает @LuiggiMendoza. Или вы можете исправить свою петлю и длину вас player массивов.

Я не уверен, что вы пытаетесь сделать. Вам нужно выбрать лучшее решение проблемы, которую вы пытаетесь решить.

1

Вы не контролируете значение p1 и p2, поэтому они могут быть больше длины вашего массива.

линия с ошибкой:

player1[p1] 
p1++; 

player2[p2] 
p2++; 

Возможным решением было бы контролировать, когда вы увеличиваете значения этих переменных:

//similar for player2 and p2 
if (p1 < player1.length) { 
    p1++; 
} 
Смежные вопросы