ArrayIndexOutOfBoundsException란?
ArrayIndexOutOfBoundsException
은 Java에서 배열의 유효 범위를 벗어난 인덱스를 접근할 때 발생하는 런타임 예외입니다. 예를 들어, 배열의 크기가 3이라면, 유효한 인덱스는 0
부터 2
까지입니다. 유효 범위를 초과하는 인덱스를 참조하려 하면 예외가 발생합니다.
예외 발생 코드 예시
String[] names = { "tom", "bob", "harry" };
for (int i = 0; i <= names.length; i++) { // i <= names.length로 범위 초과
System.out.println(names[i]); // ArrayIndexOutOfBoundsException 발생
}
위 코드는 names.length
가 3인 경우, i <= names.length
조건으로 인해 마지막 루프에서 names[3]
을 참조하려다 예외가 발생합니다.
원인
- 인덱스 범위 초과
- 배열의 유효 범위는
0
부터length - 1
까지입니다. - 위 예시에서는
names[3]
을 참조하려다 예외 발생.
- 배열의 유효 범위는
- 루프 조건 실수
- 반복문에서 조건을 잘못 설정하여 배열 범위를 초과.
- 다차원 배열 처리 오류
- 다차원 배열의 각 하위 배열 크기를 정확히 확인하지 않을 경우.
- 배열 초기화 누락
- 배열 요소를 초기화하지 않고 참조할 경우 예외 발생.
해결 방법
- 루프 조건 수정
- 반복문에서 조건을 정확히 설정합니다.
for (int i = 0; i < names.length; i++) { // 올바른 조건
System.out.println(names[i]);
}
- 향상된 for문 사용
- 배열의 모든 요소를 순회할 때 향상된 for문 사용을 권장합니다.
for (String name : names) {
System.out.println(name);
}
- 인덱스 유효성 검사
- 배열 인덱스가 유효한지 사전에 확인합니다.
int index = 3;
if (index >= 0 && index < names.length) {
System.out.println(names[index]);
}
- Java 8 Stream API 사용
- Java 8 이상에서는
Stream
API를 사용하여 더 안전하게 배열을 처리할 수 있습니다.
- Java 8 이상에서는
Arrays.stream(names).forEach(System.out::println);
예방을 위한 팁
- 배열 인덱스는 항상 0부터 시작한다는 점을 기억하세요.
- 루프에서
<=
대신<
조건을 사용하는 것이 안전합니다. - 다차원 배열의 경우 각 하위 배열의 크기를 명확히 확인하세요.
Thread-Safe
하지 않은 클래스(예:SimpleDateFormat
)는 다중 스레드 환경에서 사용할 때 주의하세요.