java.lang.ArrayIndexOutOfBoundsException 해결법
자바는 배열의 작성 및 조작을 데이터 구조로 지원합니다.
배열의 크기를 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)
arr이란 배열의 크기는 5입니다. 따라서 인덱스는 0부터 4(n-1)까지입니다.
하지만 배열의 5번째 인덱스에 접근하려고 시도했기 때문에 자바는 해당 예외를 throw한 것입니다.
또 다른 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한 것입니다.
그렇다면 프로그래머는 어떤식으로 이런 예외에 대해 올바르게 예외처리를 수행할 수 있을까요?
☞ 배열에 올바르게 접근하는 방법
반복문에서 다음과 같이 사용합니다.
for(int i = 0; i < arr.length; i++) { ... }
또한 foreach문을 사용할 수 있습니다. (foreach문에 대한 설명)
for(int i : arr) { ... }
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);
}
}
}
이상 java.lang.ArrayIndexOutOfBoundsException에 대해 알아보았습니다.
자바 예외에 대해 더 알고싶은 분은 여기를 참고하세요.
또한 본 게시글에 대한 오류나 질문사항은 아래 댓글로 남겨주세요.
공감♡ 버튼을 눌러주시면 더욱 유용하고 좋은 포스팅으로 찾아 뵙겠습니다.
'Java' 카테고리의 다른 글
자바 파일 입출력 (0) | 2018.10.04 |
---|---|
자바 가비지 컬렉션(Java Garbage Collection) (0) | 2018.09.29 |
자바 벡터(Vector)와 어레이리스트(ArrayList) 비교 (5) | 2018.09.23 |
java.lang.NullPointerException 해결법 (1) | 2018.09.10 |
자바 foreach문 사용법 (0) | 2018.09.09 |
자바 배열 사용법 (0) | 2018.09.06 |
자바 String 문자열 사용법 정리 (1) | 2018.08.20 |
[Java] 자바 웹 크롤링 - 실시간 데이터 수집 (6) | 2018.08.20 |