본문 바로가기
2023년 이전/Android

java.lang.IllegalArgumentException: pointerIndex out of range

by JeongUPark 2020. 5. 30.
반응형

Android 개발을 하다가 위와 같은 에러를 마주하게 되었습니다.

 

에러가 발생한 상황은 ViewPager의 한 화면에서 일정 view의 터치를 연타하다가 순간 적으로 View를 터치할 경우 위와 같은 에러가 발생하였습니다.

 

Log를 확인해 보니

 

java.lang.IllegalArgumentException: pointerIndex out of range
at android.view.MotionEvent.nativeGetAxisValue(Native Method)
at android.view.MotionEvent.getX(MotionEvent.java:1981)
at android.support.v4.view.MotionEventCompatEclair.getX(MotionEventCompatEclair.java:32)
at android.support.v4.view.MotionEventCompat$EclairMotionEventVersionImpl.getX(MotionEventCompat.java:86)
at android.support.v4.view.MotionEventCompat.getX(MotionEventCompat.java:184)
at android.support.v4.view.ViewPager.onInterceptTouchEvent(ViewPager.java:1339)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1817)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
at

이렇게 먼가 Touch에서 받는 MotionEvent에 문제가 있는 것으로 확인 되어 Touch 시 들어오는 Event의 좌표를 통하여 처리를 하려 했습니다. 하지만 로그를 확인해보니 문제의 getX를 통해 들어오는 좌표는 딱히 문제가 없었고. 이 때부터 구글링을 시작하게 되었습니다.

 

그리고 발견한 해결 방법은

 

ViewPager를 커스텀으로 만들어서 다음과 같이 try catch로 처리를 해주면 Exception이 발생하면 앱이 죽지 않고 처리되도록 수정을 하였습니다.

 

class CustomViewPager : ViewPager {
    constructor(context: Context) : super(context)
    constructor(context: Context, attributeSet: AttributeSet) : super(context,attributeSet)
    override fun onTouchEvent(ev: MotionEvent?): Boolean = try {
        super.onTouchEvent(ev)
    } catch (e : Exception){
        false
    }

    override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean = try {
        super.onInterceptTouchEvent(ev)
    }catch (e : Exception){
        false
    }

}

 

위의 방식이 찜찜하기 한데 가장 확실하고 정확하며, 다른 code에 영향을 미치지 않는 방식으로 판단되어 사용하였습니다.

반응형