본문 바로가기
[ Error ]/JAVA

[ Java ] IndexOutOfBoundsException 에러 해결

by 환이s 2024. 5. 9.


실무에서 프로젝트 진행 중인 과정에서  Excel 기능 개발을 하던 중

IndexOutOfBoundsException : Index:0, Size: 0 에러가 발생했다.

자바에서 흔히 볼 수 있는 Exception이라서 해당 에러가 발생했을 때

여러 가지 변수가 있겠지만 간단히 해결하는 방법을 공유하겠습니다.

 

IndexOutOfBoundsException은 앞서 말씀드린 것처럼

자바에서 발생하는 일반적인 예외 중 하나입니다.

 

보통 배열이나 유효하지 않은 인덱스에 접근하거나

리스트나 다른 자료 구조에서 유효하지 않은 인덱스를 사용해서 요소에 접근 시도하거나

문자열에 인덱스가 문자열의 길이를 초과하는 경우에 발생하는 Exception이라서

 

간단한 코드로는 파악하기 쉽지만

실무 소스를 보면 절대.. 간단한 코드 같은 건 없습니다.. 😅

 

먼저 제가 구현하고자 했던 기능은

Excel 출력 시 해당 데이터 일자 값을 출력하기 위해

java.util 패키지에 있는 Calendar 추상 클래스를 사용하는 방법을 선택했는데요.

 

현재 진행하고 있는 프로젝트 컬럼 타입이 전부 문자열이라서

데이터를 가져올 때 파싱해서 가져와야 하는 상황이었습니다.

 

회사 소스를 올릴 수 없어서 간단하게 예제 코드로 보자면

Calendar testFromDate =  Calendar.getInstance(); //인스턴스 생성
testFromDate.set(Integer.parseInt(TestList.get(0).getWorkDate().subString(0,4)),
				Integer.parseInt(TestList.get(0).getWorkDate().subString(4,6))-1,
                Integer.parseInt(TestList.get(0).getWorkDate().subString(6,8)));
                
Calendar testToDate =  Calendar.getInstance(); // 인스턴스 생성 , 주소값 동일
testToDate.set(Integer.parseInt(TestList.get(0).getWorkDate().subString(0,4)),
				Integer.parseInt(TestList.get(0).getWorkDate().subString(4,6))-1,
                Integer.parseInt(TestList.get(0).getWorkDate().subString(6,8)));

 

 

 

저는 Calendar 클래스를 선언해서 일자를 호출하려고 시도를 하다가

Exception이 발생해서 예제 코드도 Calendar를 사용했습니다!

 

Calendar 클래스를 사용하면 시간 부분으로

2024-05-09T00:00:00.000

위처럼 출력되다 보니 subString()을 활용해서

"2024년 05월 09일" 값을 출력할 수 있게 지정하고

 

Calendar 클래스에서 월은 1부터 시작하는 게 아닌,

0부터 시작하기 때문에 실제 월 값보다 -1을 빼주면서

해당 값을 보내주고 테스트를 진행했더니

 IndexOutOfBoundsException 오류를 접하게 되었어요 😐

 

결과적으로 하나씩 로그를 찍어서 확인해 봤더니

 get()으로 값을 가져오는 과정에서

해당 값이 null인데 계속 get으로 가져오려고 시도하다가

에러가 발생했던 거였습니다.. 😅

 

프로젝트 진행하면서 테이블이 여러 개 추가되거나

반대로 삭제된 테이블이 있다 보니 값을 찾을 수 없었는데요.

 

해결법으로는 신규로 생성한 테이블과 매핑해서

테스트 데이터를 추가하고 다시 한번 시도하니까

값이 제대로 출력되는 걸 확인할 수 있었어요!

 

물론 저처럼 값이 없는 경우에 해당 Exception을 접하기도 하지만

간단한 예제 코드를 통해서 IndexOutOfBoundsException 해결법을 알아 가봅시다!

 

 

 

배열(유효하지 않은 인덱스 접근)

 

 

int[] numbers = {1, 2, 3};
System.out.println(numbers[3]);// 0번 부터 시작하기 때문에 조심 실제 순서는 0,1,2

 

 

 

리스트(유효하지 않은 인덱스 접근)

 

List<String> names = new ArrayList<>();
names.add("kim");
System.out.println(names.get(1)); // 동일하게 인덱스 번호는 0부터 시작

 

 

 

문자열(유효하지 않은 인덱스 접근)

 

 

String str = "Hello";
System.out.println(str.charAt(10)); // Hello 문자열의 길이는 5이다.

//H e l l o
//0 1 2 3 4

 

문자열의 특정 인덱스에 있는 문자를 가져오려는 시도는 

자주 사용하는 방법은 아니지만

위 코드처럼 인덱스 10에 해당하는 문자가 없으므로

IndexOutOfBoundsException을 발생시킬 수 있어서 추가했습니다.


마치며

 

오늘은 인덱스를 다루면 자주 볼 수 있는 IndexOutOfBoundsException의 해결법에 대해 알아봤습니다.

 

다음 포스팅에서 뵙겠습니다.

728x90