막무가내 삽질 블로그

java.lang.IndexOutOfBoundsException: 에러 난 이유 본문

Android

java.lang.IndexOutOfBoundsException: 에러 난 이유

joong~ 2019. 12. 17. 03:09
728x90

다이얼로그에서 아이템을 추가,삭제 했을때 발생한 에러

 

 

기존코드에서 테스트 했을 때 문제없이 진행되었다. 근데 어떤 상황이 닥칠지 몰라 아이템을 추가,삭제 무한으로 테스트 해보다가 발생한 상황

java.lang.IndexOutOfBoundsException:

내가 가지고 있는 사이즈보다 추가할 인덱스가 클경우 발생하는 오류

해당 오류가 발생했을때 앱이 강제로 종료된다. 따라서 앱이 튕기지 않게 예외처리를 해주었다.

 

기존코드

        builder.setMultiChoiceItems(items, null, (dialogInterface, i, b) -> {
            if (b) {
                select.add(i);
            } else {
                select.remove(i);
            }
        });

 

해결코드

        builder.setMultiChoiceItems(items, null, (dialogInterface, i, b) -> {
            if (b) {
                try {
                    select.add(i);
                } catch (IndexOutOfBoundsException e) {
                    e.printStackTrace();
                }
            } else {
                try {
                    select.remove(i);
                } catch (IndexOutOfBoundsException e) {
                    e.printStackTrace();
                }
            }
        });

이러면 앱이 튕기지 않고 값이 그대로 나왔다. 하지만 이 코드도 무한테스트 해보니 select 값에 지워도 계속 값이 저장되는 걸 발견했다. 코드적으로 문제 있는거 같아서 다시 살펴보았다.

A list 에 9개의 값이 들어가 있고 클릭했을때 B list 에 A의 인덱스를 넣는 코드 였다.(기존코드 참고)

이걸 인덱스 값 말고 A list에 값을 넣어주고 해제했을때 값을 삭제하니 바로 해결했다.

 

 

 

인덱스에서 값으로 변경

최종코드

        builder.setMultiChoiceItems(items, null, (dialogInterface, i, b) -> {
            if (b) {
                select.add(hobbyItem.get(i));
                Log.d(TAG, "인덱스" + i);
                Log.d(TAG, "값" + hobbyItem.get(i));
            } else {
                select.remove(hobbyItem.get(i));
                Log.d(TAG, "인덱스" + i);
                Log.d(TAG, "값" + hobbyItem.get(i));
            }
        });

 

 

 

 

안드로이드 스터디 모집

www.notion.so/fundevjay/Android-ddf96b24265e414fb2d9e8fc5d388b80

Comments