看起来像这样的异常令人困惑:
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)
我找到了一堆与此相关的问题,但没有一个回答“如何调试这个”。所以我正在提出这个问题/答案。
通过查看android源码here http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.3_r2.1/android/os/Parcel.java#Parcel.readException%28%29 and here http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.3_r2.1/android/os/Parcel.java#Parcel.readException%28int,java.lang.String%29你会发现它可以抛出以下任何一个(NullPointerException正是我所拥有的):
SecurityException(msg);
BadParcelableException(msg);
IllegalArgumentException(msg);
NullPointerException(msg);
IllegalStateException(msg);
RuntimeException("Unknown exception code: " + code + " msg " + msg);
但是什么原因造成这些呢?
这里发生的事情是这样的readException()
正在检查 IPC 字节流中是否存在表示发生异常的标头;如果它找到一个,那么它会抛出该类型的新异常,并具有相同的消息,但缺少原始堆栈跟踪。 (它实际上只知道一些异常类型;其他任何内容都会被转换为基本类型RuntimeException
.)
那么最初的异常是从哪里来的呢?嗯,在真正实施的某个地方YourClass.yourMethod()
-- 不在任何 Parcelable 或 IPC 代码中。所以去那里,将整个方法包装在 try/catch 中,并记录你捕获的任何内容。
(或者如果您有远程进程断点工作,则在那里设置一个断点。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)