2014-09-30 3 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

이 부울 [] [] cellsInput = 새로운 부울 [길이 - 1] [폭 - 1]; '도 잘못되었습니다. –

+0

예외 스택 추적을보고 예외 발생 위치를 확인하십시오. 해당 명령문 앞에 println 문을 추가하여 인덱스 값과 배열 크기를 인쇄하십시오. 어떤 가치가 잘못되었는지 판단하십시오. 그런 다음 코드를 거꾸로하여 그 값이 잘못된 이유를 알아냅니다. 그것은 기본적인 디버깅 프로세스입니다. –

답변

2

문제는 여기에 있습니다 :

if (count <= length) { 

결국,이 길이가 두 번째 배열의 길이

cellsInput[y++][length] 

를 참조하려고 할 것이다. 그러나 두 번째 배열의 마지막 인덱스는 실제로 length - 1입니다.으로 시작하는 의 모든 배열은 Java로 시작하기 때문에 여기에서 문제가 발생합니다. 그래서 항상하고 싶어.

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) { 
관련 문제