티스토리 뷰


오늘은 indexOutofBoundException를 만나는 이유와 에러 해결 방법을 알아보도록 하자. 자바로 코딩을 하는 사람들이면 늘상 만나는 Exception 중에서 3형제를 꼽는다면 꼭 안에는 들어갈법한 녀석이다. 안그런가? ㅎㅎ 

얼마전인가 이 짤을 보고서는 피식 웃었던 기억이 난다. 그만큼 공감이 가는 짤이라고나 할까.

 

Catch e if you can

indexOutofBoundException 발생하는 이유는?

저녀석이 나오는 이유는 배열이나 문자열을 접근할 때 가진 길이보다 높은 인덱스를 엑세스하려고 할때 나오는 예외다.

 

즉, 예를 들자면 길이가 3인 배열을 가지고 있는데 ( int[] a = new int[]{1,2,3}; ) a[0], a[1], a[2] 까지는 접근이 되지만 a[3]이상의 숫자로 접근을 시도하려고 하면 바로 indexOutofBoundException가 발생하게 된다. 

 

indexOutofBoundException 해결방법?

주로 개발자들이 입력값을 믿고 인덱스 값에 바로 접근하는 경우에 발생한다. 배열이면 "a[10];" 이런식으로. 그래서 아래처럼 if 문으로 길이를 검사한 뒤 처리를 하면 에러처리를 방지할 수 있다.

if( a.length > 10 ){
	a[10] = 1;
}

때로는 그냥 두어라.

그런데 생각없이 길이검사를 하도록 모든 배열이나 문자열 인덱스 접근하는 코드들에 대하여 처리를 하면 더욱 큰 버그를 발생할 수 있다. 그럴때는 차라리 indexOutofBoundException가 발생하여 에러를 만나는 편이 더 나을 수도 있다. 호미로 막을걸 가래로 막는다는 말이 있다. ( 가래로도 못막을 수도 있다. ㅠㅠ )

 

indexOutofBoundException가 발생하면 runtimeException으로 프로그램이 종료되어 개발자가 바로 알아차리고 수정할 기회가 생기는데 예외만 발생하지 않도록 처리해버려 계속해서 프로그램이 잘못돌아가는 상황을 만들게 되면 뒷감당이 정말 힘들어질수 있다. 

 

그러니 입력값에 따라 처리하지 않을수 있는 조건인지 확실히 따져보고, 리스크가 크다면 runtimeException이 발생하도록 두는 것이 더 나은 판단일수 있다. 


댓글
최근에 올라온 글
최근에 달린 댓글