2014-09-30 8 views
0

Я написал фрагмент кода, который продолжает давать мне ошибку ArrayIndexOutOfBoundsException, и я действительно не знаю почему. Я думаю, что я правильно задал размеры массивов, но, видимо, это неверно. Даже если я задаю размеры массивов до 100, я все равно получаю ошибку. Ниже кода вы можете найти ввод данных.Не знаю, что вызывает мою ошибку ArrayIndexOutOfBoundsException

import java.util.Scanner; 

public class GameOfLife { 

public static void main(String []args) { 

    Scanner scanner = new Scanner(System.in); 

    int length = scanner.nextInt(); 
    int width = scanner.nextInt(); 
    int generations = scanner.nextInt(); 
    Boolean[][] cellsInput = new Boolean[length - 1][width - 1]; 

    System.out.println(); 
    int count = 0; 
    int y = 0; 
    while (scanner.hasNext()) { 
     count++; 
     if (count <= length) { 
      if (scanner.next().equals(".")){ 
       cellsInput[y++][count] = false; 
      } else if (scanner.next().equals("*")) { 
       cellsInput[y++][count] = true; 
      } 
     } 
     else { 
      count = 0; 
      y++; 
      if (scanner.next().equals(".")){ 
       cellsInput[y++][count] = false; 
      } else if (scanner.next().equals("*")) { 
       cellsInput[y++][count] = true; 
      } 
     } 
    } 

} 

}

ввода (например):

15 15 3 
. . . . . . . . . . . . . * . 
. . . . . . . . . . . . * . . 
. . . . . . . . . . . . * * * 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
* * * * * * * * . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
+0

Не думайте, что вы правильно задали размеры: проверьте. Используйте некоторые тактические инструкции 'System.out.println()' для проверки *, чтобы ваши индексы находились в допустимых диапазонах. –

+0

Это 'Boolean [] [] cellsInput = new Boolean [length - 1] [width - 1];' тоже неверно. –

+0

Посмотрите на трассировку стека исключений, чтобы определить, где происходит исключение. Добавьте инструкции println перед этим оператором, чтобы распечатать значения индекса и размеры массива. Определите, какая ценность идет не так. Затем перейдите через свой код, чтобы понять, почему это значение неверно. Это основной процесс отладки. –

ответ

2

Проблема здесь:

if (count <= length) { 

В конце концов, это будет пытаться ссылаться

cellsInput[y++][length] 

Где длина длина этого второго массива. Однако последний индекс во втором массиве фактически равен length - 1.

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

if (count < length) { 

всякий раз, когда длина равна длине массива.

Длина всегда есть количество объектов в массиве, которое начинается с 1.

Пример:

Array arr1 = [a, b, c, d] 
Length of arr1 = 4, it has 4 elements 

Element | Index 
-------------------- 
    a  | 0 
    b  | 1 
    c  | 2 
    d  | 3 

Как вы можете видеть, индекс 4 выходит за пределы границ. Поэтому, когда вы пытаетесь обратиться к arr1[arr1.length], вы получаете IndexOutOfBoundsException

4

Например, следующая строка является неправильным:

if (count <= length) { 

Поскольку вы используете счет в качестве индекса, когда счетчик равен длина, она превышает наибольший индекс length - 1 - таким образом ArrayIndexOutOfBoundsException. Оно должно быть:

if (count < length) { 
Смежные вопросы