java.lang.ArrayIndexOutOfBoundsException: -1 원인과 해결 방법

링크가 복사되었습니다
조회 1

java.lang.ArrayIndexOutOfBoundsException: -1 오류, 원인과 해결책 완벽 분석

java.lang.ArrayIndexOutOfBoundsException: -1 오류는 자바 프로그래밍에서 배열을 다룰 때 흔히 발생하는 예외 중 하나입니다. 이 오류는 배열의 유효한 범위를 벗어난 인덱스로 접근하려고 할 때 발생하며, 특히 음수 인덱스(-1)로 접근하려 할 때 나타나는 구체적인 경우입니다.

오류 발생의 주요 원인

이 예외가 발생하는 가장 큰 이유는 배열의 인덱스가 0 이상이고 배열의 크기보다 작아야 한다는 규칙을 위반했기 때문입니다. -1이라는 인덱스는 배열의 시작점인 0보다 작으므로 유효한 인덱스가 아닙니다. 일반적으로 이러한 상황은 다음과 같은 경우에 발생할 수 있습니다.

  1. 잘못된 반복문 조건: 배열을 순회하는 for 루프나 while 루프에서 종료 조건을 잘못 설정하여 실제 배열의 범위를 벗어나는 인덱스에 접근하는 경우입니다. 예를 들어, 배열의 크기를 잘못 계산했거나, 루프 카운터를 잘못 관리했을 때 발생할 수 있습니다.
  2. 계산 오류: 배열의 인덱스를 계산하는 과정에서 논리적인 오류가 발생하여 음수 값이 나오는 경우입니다. 이는 사용자 입력값이나 다른 변수의 값을 기반으로 인덱스를 계산할 때 특히 주의해야 합니다.
  3. 빈 배열 또는 null 배열: 배열이 비어 있거나 null인 상태에서 해당 배열의 요소를 참조하려고 할 때도 유사한 문제가 발생할 수 있으며, 이 과정에서 인덱스 계산이 잘못되어 -1이 나올 수 있습니다.
  4. indexOf 또는 lastIndexOf 메소드의 반환값 처리: String 객체에서 특정 문자열의 위치를 찾는 indexOf 메소드 등은 해당 문자열을 찾지 못했을 때 -1을 반환합니다. 이 반환값을 배열의 인덱스로 직접 사용하려고 할 때 이 오류가 발생합니다.

해결 방법 및 예방책

이 오류를 해결하기 위해서는 코드의 해당 부분에서 배열 인덱스가 어떻게 계산되고 사용되는지를 면밀히 검토해야 합니다. 다음은 몇 가지 구체적인 해결 방법입니다.

  1. 인덱스 유효성 검사: 배열에 접근하기 전에 항상 인덱스의 유효성을 검사하는 습관을 들여야 합니다. 인덱스가 0보다 크거나 같고, 배열의 크기보다 작은지를 확인하는 if 문을 추가하는 것이 좋습니다.
    if (index >= 0 && index < array.length) {
        // 안전하게 배열 요소 접근
        array[index] = value;
    } else {
        // 오류 처리 또는 경고 메시지 출력
        System.err.println("Invalid index: " + index);
    }
    
  2. 반복문 조건 재검토: for 루프를 사용할 경우, i < array.length와 같이 배열의 크기를 정확히 반영하는 종료 조건을 사용하고, i >= 0과 같이 시작 인덱스도 올바르게 설정되었는지 확인해야 합니다.
    for (int i = 0; i < array.length; i++) {
        // 배열 요소 처리
    }
    
  3. indexOf 결과 처리: indexOf 메소드 등을 사용한 후 반환된 값이 -1인지 확인하는 로직을 추가해야 합니다. 만약 -1이라면 해당 항목이 존재하지 않는 것이므로, 이를 기반으로 하는 배열 접근을 건너뛰거나 다른 방식으로 처리해야 합니다.
    int index = str.indexOf("search");
    if (index != -1) {
        // 찾았을 경우 배열 접근 등 처리
        System.out.println("Found at index: " + index);
    } else {
        System.out.println("Not found.");
    }
    
  4. 디버깅: 오류가 발생하는 정확한 지점을 찾기 위해 디버거를 사용하거나, 로그를 출력하여 각 변수의 값과 실행 흐름을 추적하는 것이 매우 중요합니다. 특히 인덱스 계산에 관여하는 변수들의 값을 주의 깊게 살펴보세요.

실제 사례 및 예시 코드

다음은 indexOf 메소드의 반환값을 잘못 사용하여 ArrayIndexOutOfBoundsException: -1 오류를 발생시키는 간단한 예시입니다.

public class Example {
    public static void main(String[] args) {
        String[] data = {"apple", "banana", "cherry"};
        String searchTarget = "grape"; // 배열에 없는 문자열

        int index = -1;
        for (int i = 0; i < data.length; i++) {
            if (data[i].equals(searchTarget)) {
                index = i;
                break;
            }
        }

        // 여기서 index는 -1이 될 것임 (찾지 못했으므로)
        // 이 -1을 배열 인덱스로 사용하려고 하면 오류 발생
        // System.out.println(data[index]); // 이 줄에서 ArrayIndexOutOfBoundsException 발생

        if (index != -1) {
            System.out.println("Found: " + data[index]);
        } else {
            System.out.println(searchTarget + " not found in the array.");
        }
    }
}

위 예시 코드에서 searchTarget인 "grape"는 data 배열에 존재하지 않으므로 index 변수는 루프가 끝난 후에도 초기값인 -1을 유지하게 됩니다. 만약 이 index 값으로 data[index]에 접근하려 한다면 ArrayIndexOutOfBoundsException: -1 예외가 발생합니다. 따라서 if (index != -1)과 같은 검사를 통해 이러한 상황을 방지해야 합니다.

결론

java.lang.ArrayIndexOutOfBoundsException: -1 오류는 배열 인덱스의 유효성을 제대로 검사하지 않거나, indexOf와 같이 특정 상황에서 -1을 반환하는 메소드의 결과를 부주의하게 사용할 때 발생합니다. 코드에서 배열에 접근하는 모든 지점을 꼼꼼히 검토하고, 항상 인덱스의 유효성을 확인하는 방어적인 코딩 습관을 통해 이 오류를 효과적으로 예방하고 해결할 수 있습니다.

이 글이 도움이 되셨나요?← 홈으로