본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[android] Framework 혹은 3rd-party lib 이 뿜는 Exception 을 피해보자 ( ex) NullPointerException at acm.a )

by 돼지왕 왕돼지 2018. 4. 22.
반응형

Framework 혹은 3rd-party lib 이 뿜는 Exception 을 피해보자 ( ex) NullPointerException at acm.a )


3rd party lib exception, acm.a, adactivity, framework exception, Framework 혹은 3rd-party lib 이 뿜는 Exception 을 피해보자 ( ex) NullPointerException at acm.a ), getDefaultUncaughtExceptionHandler, NPE, NullPointerException, uncaughtException, uncaughtexceptionhandler


현재는 문제가 되지 않겠지만, 이전 버전의 adsense lib 을 사용하다 보면, 아래와 같은 crash report 가 올라오곤 했다.


Caused by: java.lang.NullPointerException

       at acm.a(SourceFile:215)

       at acz.onTransact(SourceFile:58)

       at android.os.Binder.transact(Binder.java:279)

       at com.google.android.gms.internal.co$a$a.onCreate()

       at com.google.android.gms.ads.AdActivity.onCreate()

       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)

       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1622)

       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1674)

       at android.app.ActivityThread.access$1500(ActivityThread.java:117)

       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:942)

       at android.os.Handler.dispatchMessage(Handler.java:99)

       at android.os.Looper.loop(Looper.java:130)

       at android.app.ActivityThread.main(ActivityThread.java:3694)

       at java.lang.reflect.Method.invokeNative(Method.java)

       at java.lang.reflect.Method.invoke(Method.java:507)

       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)

       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

       at dalvik.system.NativeStart.main(NativeStart.java)



3rd party lib 에서 뿜어내는 에러로 control 하기 힘든 crash...

그러나 우리에게는 UncaughtExceptionHandler 가 있다.


아래의 코드를 Application 을 상속한 class 에 넣어주는 방식으로

Adworker thread 가 내뿜는 해당 에러를 잡을 수 있다.


final UncaughtExceptionHandler defaultHandler = Thread.getDefaultUncaughtExceptionHandler();

Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {

        @Override

        public void uncaughtException(Thread thread, Throwable ex) {

            if (thread.getName().startsWith("AdWorker")) {

                Log.w("ADMOB", "AdWorker thread thrown an exception.", ex);

            } else if (defaultHandler != null) {

                defaultHandler.uncaughtException(thread, ex);

            } else {

                throw new RuntimeException("No default uncaught exception handler.", ex);

            }

        }

});



비슷한 뉘앙스로 framework 가 뿜어내는 specific 한 exception 을 우리는 피할 수 있다.




반응형

댓글