본문

_reply.readException();에서 NullPointerException이 발생하는 경우

02-25 01:01:21.917: W/dalvikvm(824): threadid=1: thread exiting with uncaught exception (group=0x4001d800)

02-25 01:01:21.927: E/AndroidRuntime(824): FATAL EXCEPTION: main

02-25 01:01:21.927: E/AndroidRuntime(824): java.lang.NullPointerException

02-25 01:01:21.927: E/AndroidRuntime(824): at android.os.Parcel.readException(Parcel.java:1253)

02-25 01:01:21.927: E/AndroidRuntime(824): at android.os.Parcel.readException(Parcel.java:1235)

02-25 01:01:21.927: E/AndroidRuntime(824): at com.activity.ACTIVITY$9.onClick(ACTIVITY.java:212)

02-25 01:01:21.927: E/AndroidRuntime(824): at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:158)

02-25 01:01:21.927: E/AndroidRuntime(824): at android.os.Handler.dispatchMessage(Handler.java:99)

02-25 01:01:21.927: E/AndroidRuntime(824): at android.os.Looper.loop(Looper.java:123)

02-25 01:01:21.927: E/AndroidRuntime(824): at android.app.ActivityThread.main(ActivityThread.java:4627)

02-25 01:01:21.927: E/AndroidRuntime(824): at java.lang.reflect.Method.invokeNative(Native Method)

02-25 01:01:21.927: E/AndroidRuntime(824): at java.lang.reflect.Method.invoke(Method.java:521)

02-25 01:01:21.927: E/AndroidRuntime(824): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)

02-25 01:01:21.927: E/AndroidRuntime(824): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)

02-25 01:01:21.927: E/AndroidRuntime(824): at dalvik.system.NativeStart.main(Native Method)


리모트 서비스('안드로이드 리모트 서비스 만들기 #1. with AIDL' 참고)를 만들다 보면 생길 수 있는 문제이다. aidl 문서가 작성되면 /gen 폴더에 자동으로 java 파일이 작성되는데, 위와 같이 출력되는 logcat 상에서 나타나는 오류를 추적해 올라가면 이 java 파일에 이르게 되고, _data.writeString(gp); mRemote.transact(Stub.TRANSACTION_selectGroup, _data, _reply, 0); _reply.readException(); 이렇게 생긴 부분에서 오류를 배출한다. 인자나 방향성을 아무리 바꿔도 문제가 해결이 되지 않는데. 사실 이 문제는 다른곳에 있다.

문제는 서비스 상에 있는, 해당하는 메소드 내에서 찾아볼 수 있다. 잘 찾아보면 arr[-1]과 같이 오류를 뿜어내는 코드가 숨어있을 것이다. 이렇게 오류가 발생할때, 원래 exception을 상위(이전) 스택으로 전달해야 하는데, 이 때 'AIDL로 전달되는 컴플렉스 타입은 Parcelable으로 미리 구현되어있어야 한다' 라는 점을 상기해볼 때('안드로이드 리모트 서비스 만들기 #2. Parcelable'), 오류가 발생하리라는 것은 예상할 수 있다.

따라서 해결책은 물론 해당 메소드 내에서의 오류를 해결하는 것이지만 도저히 어디서 오류가 나오는지 알 수 없다 한다면 try-catch를 사용하여 오류의 내용을 확인하고 처리하는것이 한 방법이다. 

댓글

Holic Spirit :: Tistory Edition

design by tokiidesu. powerd by kakao.