[Error_Log] java.lang.ArrayIndexOutOfBoundsException
본문 바로가기
IT 이야기/JBoss EAP

[Error_Log] java.lang.ArrayIndexOutOfBoundsException

by 찬찬이 아빠 2020. 4. 28.
반응형

자바는 배열의 작성 및 조작을 데이터 구조로 지원합니다. 

 

배열의 크기를 n이라고 했을 때 배열의 인덱스는 1부터 n까지가 아닌 0부터 n-1까지입니다. 

 

프로그래밍 중 ArrayIndexOutOfBoundsException이 가장 많이 발생하는 이유중 하나죠.

 

C/C++과 달리 자바는 인덱스가 배열의 크기보다 크거나 음수 인덱스에 대한 요청이 있으면 자바는 위의 예외를 발생시킵니다.

 

또한 이 예외는 자바 컴파일러는 검사하지않고 항상 런타임(실행도중)에 예외를 발생시킵니다.

 

다음은 Exception 발생의 예입니다.

int[] arr = {0, 1, 2, 3, 4};
		
arr[5] = 4; // 예외 발생!!

 

해당 프로그램 실행 시 다음과 같은 오류가 발생합니다.

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 
at average.Main.main(Main.java:9)

 

또 다른 Exception 발생의 예입니다.

ArrayList<String> list = new ArrayList<>();
list.add("Hello");
list.add("Wolrd");
		
list.get(2); // 예외 발생!!

 

해당 프로그램 실행 시 다음과 같은 오류가 발생합니다.

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2 
at java.util.ArrayList.rangeCheck(ArrayList.java:657)
at java.util.ArrayList.get(ArrayList.java:433)
at average.Main.main(Main.java:11)

위 코드를 보시면 list 객체를 생성하고 2번 add해주었습니다. (list의 크기 = 2)

list의 크기가 2이므로 접근 가능한 인덱스는 0부터 1(2-1)까지입니다. 따라서 list의 2번째 인덱스에 접근하려고 했기 때문에 해당 예외를 throw한 것입니다.

그렇다면 프로그래머는 어떤식으로 이런 예외에 대해 올바르게 예외처리를 수행할 수 있을까요?



☞ 배열에 올바르게 접근하는 방법

 

1. 반복문에서 다음과 같이 사용합니다.

for(int i = 0; i < arr.length; i++) { ... }

 

2. foreach문을 사용할 수 있습니다.

foreach(For-each)문은 for, while, do-while 반복문과 같은 배열 탐색 기법입니다.

 § 일반적인 for 반복문과 동일하게 for 키워드를 사용합니다.

 § 반복문 내에 카운터 변수를 선언하고 콜론(:) 다음 배열이름을 순서대로 선언합니다.

 § 일반적으로 배열이나 Collection 클래스(ArrayList ... 등)를 반복하는 데 사용됩니다.


※ 구문(Syntax)

일반적으로 배열을 탐색할 때 다음과 같이 for 반복문을 사용합니다.

int[] arr = {0, 1, 2, 3, 4};
		
for (int i = 0; i < 5; i++) { 
System.out.println(arr[i]); // 0 1 2 3 4 출력
}


위 반복문을 foreach 반복문으로 다음과 같이 표현할 수 있습니다.

int[] arr = {0, 1, 2, 3, 4};

for (int i : arr) { 
System.out.println(arr[i]); // 0 1 2 3 4 출력
}

 

3. Try-Catch문 사용하기 : 다음과 같이 사용 가능합니다.

import java.util.ArrayList;

public class Main {
	public static void main(String[] arg) {
		try {
			ArrayList<String> list = new ArrayList<>();
			list.add("Hello");
			list.add("Wolrd");
			
			list.get(2);
		}
		catch(IndexOutOfBoundsException e) {
			System.out.println(e);
		}
	}
}

 

반응형

댓글