Java에서 배열은 고정된 크기를 가진 데이터 구조로, 인덱스를 통해 각 요소에 접근합니다.
그러나 배열의 인덱스가 유효 범위를 초과할 경우 ArrayIndexOutOfBoundsException이 발생합니다.
이 오류는 런타임 시 발생하며, 인덱스 범위를 정확히 확인하지 않았음을 알리는 에러입니다.
ArrayIndexOutOfBoundsException 발생 원인
- 인덱스 초과: 배열의 크기를 초과하는 인덱스에 접근하려 할 때 발생합니다.
ex) 크기가 5인 배열에 5 또는 그 이상의 인덱스를 사용하면 오류가 발생합니다. - 음수 인덱스 사용: 배열의 인덱스는 0부터 시작하므로, 음수 인덱스를 사용하면 예외가 발생합니다.
- 루프에서의 오류: 배열을 반복 처리하는 루프에서 인덱스를 잘못 설정하거나, 루프 조건을 잘못 설정하여 인덱스가 범위를 초과하게 될 수 있습니다.
ArrayIndexOutOfBoundsException 발생 예제 코드
public class Main {
public static void main(String[] args) {
int[] numbers = {1, 2, 3, 4, 5};
// 잘못된 인덱스 접근
try {
System.out.println(numbers[5]); // 이 줄에서 ArrayIndexOutOfBoundsException 발생
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("ArrayIndexOutOfBoundsException 발생: " + e.getMessage());
}
// 음수 인덱스 접근
try {
System.out.println(numbers[-1]); // 이 줄에서도 ArrayIndexOutOfBoundsException 발생
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("ArrayIndexOutOfBoundsException 발생: " + e.getMessage());
}
}
}
위 코드에서 첫 번째 try 블록은 배열의 크기를 초과하는 인덱스에 접근하려 하여 ArrayIndexOutOfBoundsException을 발생시키고, 두 번째 블록은 음수 인덱스에 접근하여 같은 예외를 발생시킵니다.
방지 및 해결 방법
#1 인덱스 범위 확인: 배열에 접근하기 전에 인덱스가 0 이상이며 배열의 크기보다 작은지 확인합니다.
#2 루프 조건 검토: 배열을 반복 처리할 때는 루프 조건을 신중하게 설정해야 합니다.
예를 들어, for 루프를 사용할 때는 배열의 길이를 기준으로 조건을 설정합니다.
#3 배열 크기 동적 관리: Java의 ArrayList와 같은 동적 배열을 사용하면, 배열의 크기를 자동으로 관리할 수 있습니다.
이러한 자료구조는 요소를 추가하거나 삭제할 때 인덱스를 자동으로 관리해 주므로 ArrayIndexOutOfBoundsException의 위험을 줄일 수 있습니다.
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
// ArrayList는 인덱스 범위를 초과할 경우, 적절한 예외 메시지를 제공합니다.
try {
System.out.println(numbers.get(3)); // 인덱스 초과
} catch (IndexOutOfBoundsException e) {
System.out.println("IndexOutOfBoundsException 발생: " + e.getMessage());
}
}
}
#4 예외 처리 사용: 배열 접근 시 발생할 수 있는 예외를 try-catch 블록으로 감싸 예외를 처리합니다.
이를 통해 프로그램이 비정상적으로 종료되지 않도록 할 수 있습니다.
마무리
ArrayIndexOutOfBoundsException은 Java에서 배열을 사용할 때 자주 발생할 수 있는 오류입니다.
이 오류를 예방하기 위해서는 인덱스 범위를 철저히 확인하고, 배열을 반복 처리할 때 루프 조건을 신중하게 설정하는 것이 중요합니다.
'IT · 인터넷' 카테고리의 다른 글
[Java] 컴파일 시점과 런타임 시점 (0) | 2025.01.31 |
---|---|
[Notion] 노션 사용법 및 노션 템플릿 사용법 (1) | 2025.01.28 |
[Java] ClassCastException: 잘못된 타입으로 객체 캐스팅 (1) | 2025.01.26 |
[Java] 인터셉터 (Interceptor): 요청과 응답을 가로채는 기술 (2) | 2025.01.25 |
[Java] Socket 통신 (0) | 2025.01.24 |