我随机发生NullPointerException如下:
03-28 11:32:36.557 E/AndroidRuntime( 3656): FATAL EXCEPTION: main
03-28 11:32:36.557 E/AndroidRuntime( 3656): java.lang.NullPointerException
03-28 11:32:36.557 E/AndroidRuntime( 3656): at android.os.MessageQueue.pullNextLocked(MessageQueue.java:166)
03-28 11:32:36.557 E/AndroidRuntime( 3656): at android.os.MessageQueue.next(MessageQueue.java:101)
03-28 11:32:36.557 E/AndroidRuntime( 3656): at android.os.Looper.loop(Looper.java:110)
03-28 11:32:36.557 E/AndroidRuntime( 3656): at android.app.ActivityThread.main(ActivityThread.java:4627)
03-28 11:32:36.557 E/AndroidRuntime( 3656): at java.lang.reflect.Method.invokeNative(Native Method)
03-28 11:32:36.557 E/AndroidRuntime( 3656): at java.lang.reflect.Method.invoke(Method.java:521)
03-28 11:32:36.557 E/AndroidRuntime( 3656): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
03-28 11:32:36.557 E/AndroidRuntime( 3656): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
03-28 11:32:36.557 E/AndroidRuntime( 3656): at dalvik.system.NativeStart.main(Native Method)
我检查MessageQueue.java:166,这是代码
final Message pullNextLocked(long now){
Message msg = mMessages;
if(msg != null){
if(now>= msg.when){
mMessages =msg.next;
if(Config.LOGV) Log.v(
"MessageQueue", "Returning message: "+ msg);
return msg;
}
}
return null; // 166
}
有可能吗? 感谢。
答案 0 :(得分:3)
return null;
不能抛出NullPointerException
。
IMO,最可能的解释是您正在查看的Java源代码与正在执行的代码不匹配;即实际编译的源代码的第166行不是该行。
如果MessageQueue
是Android类,那么很可能是@Thilo注意到的问题;即您的Android SDK版本与您尝试调试的Android版设备不匹配。
(而且,现在我更仔细地看,MessageQueue
是一个Android类:包名称说得很清楚。杜!)
否则,请仔细查看您构建应用程序并将其部署到设备的方式。
(理论上理论上可能是Java编译器或Davlik中的错误导致堆栈跟踪错误地报告行号。但我认为这种解释高度不太可能那种在beta测试中发现/修复过的bug。或者我们听说过的......)
答案 1 :(得分:2)
假设方法体是正确的并且只是行号是错误的,那么这个特定方法中任何地方NPE的唯一可能原因是msg.when
实际上是Long
并且是{ {1}}然后无法取消装箱到null
。
我至少会相应修复long
声明。
if