Parcel.readException中的NullPointerException(等)

ben*_*nkc 8 android parcel

看起来像这样的例外令人困惑:

FATAL EXCEPTION: main
java.lang.NullPointerException
    at android.os.Parcel.readException(Parcel.java:1437)
    at android.os.Parcel.readException(Parcel.java:1385)
    at com.yourpackage.ipc.IYourClass$Stub$Proxy.yourMethod(IYourClass.java:488)
    at com.yourpackage.ipc.YourClassShim.yourMethod(YourClassShim.java:269)
Run Code Online (Sandbox Code Playgroud)

我找到了一堆相关的问题,但没有一个回答"你如何调试这个".所以我正在提出这个问题/答案.

通过查看这里这里的android源代码,你会看到它可以抛出任何这些(NullPointerException就是我所拥有的):

SecurityException(msg);
BadParcelableException(msg);
IllegalArgumentException(msg);
NullPointerException(msg);
IllegalStateException(msg);
RuntimeException("Unknown exception code: " + code + " msg " + msg);
Run Code Online (Sandbox Code Playgroud)

但究竟是什么导致了这些?

ben*_*nkc 18

这里发生的readException()是检查IPC字节流以查找发生异常的标头; 如果它找到一个,那么它会抛出该类型的新异常,并使用相同的消息,但是缺少原始堆栈跟踪.(它实际上只知道一些异常类型;其他任何东西都被转换为基础RuntimeException.)

那么最初的异常来自哪里?好吧,在真正实现的内容中的某个地方YourClass.yourMethod()- 不是在任何parcelable或IPC代码中.所以去那里,将整个方法包装在try/catch中,并记录你抓到的任何内容.

(或者如果你有远程进程断点工作,那么在那里设置一个断点.)