본문 바로가기
Exception (예외)/Java

IndexOutOfBoundsException (예외)

by Hwanii_ 2023. 5. 20.
728x90

a) 351번째 코드라인에서 예외 발생

 

b) IndexOutOfBoundsException

 

c) IndexOutOfBoundsException 예외 ? 

: 리스트형 (배열리스트) 객체에서 선언되지 않은 요소를 get() 하는 경우에 발생.

 

문제의 상황

1. num : 상품의 고유 번호를 입력 받아 저장할 변수

2. for문 : 0번째 부터 배열리스트 객체의 크기보다 작을때까지 (인덱스는 0부터 시작하니)

반복하면서, 

3. if문 : 만약 내가 입력한 고유번호가 배열리스트 객체의 i번째 값의 고유번호랑 같아 ?

그러면 배열리스트 객체의 i번째 값을 삭제해줘.

4. 

System.out.println(data.get(i).getName() + " 상품이 삭제 되었습니다. \n");

break;

 

d) 해결 방안

 

출력문에, 배열리스트 객체의 i번째 값의 고유번호 + 상품이 삭제 됬다는 안내 멘트를 출력 중인데,

 

data.remove(i) 된 객체는 삭제 되었으니, 선언되지 않은 요소를 get() 해서 발생 하게 된것이다.

 

따라서, 지금 오류는 단순하게 아래와 같이 출력문을 수정하면 해결 된다.

System.out.println("상품이 삭제 되었습니다. \n");

 

+++

 

위의 경우는 객체(상품)를 1개만 만들어둬서 해당 에러가 뜬것인데,

객체를 여러개 만들었을 경우에는,

IndexOutOfBoundsException 오류가 뜨지 않는다.

 

왜?

 

삭제된 객체의 자리에 다른 요소들이 밀려와서

i + 1번째 요소가 i번째로 오게된다.

그래서, 출력을 하면 엉뚱한 객체(상품)의 이름이 뜨는걸 확인하게 된다.

 

예를들어, 배열리스트에 첫번째로 아이스크림, 두번째로 피자, 세번째로 햄버거

객체를 만들어 뒀으면, 각각 0번째, 1번째, 2번째 인덱스에 위치해 있으며,

만약, 아이스크림 객체를 remove() 하게 될경우,

1번째 인덱스에 위치하는 피자가 0번째로 이동하게 되고,

2번째 인덱스에 위치하는 햄버거가 1번째로 이동하게 된다.

 

그래서 data.get(i).getName() 을 프린트 하면

삭제된 상품은 아이스크림 인데

아래와 같이 출력 하게 되는것을 확인 할 수 있다.

 

 

반응형

'Exception (예외) > Java' 카테고리의 다른 글

NullPointerException (예외)  (0) 2023.08.21
NoSuchElementException (예외)  (0) 2023.05.20
NullPointerException (예외)  (0) 2023.05.13
IndexOutOfBoundsException (예외)  (0) 2023.05.08