可能吗? “return null”时得到NullPointerException

时间:2011-03-30 02:51:05

标签: java android

我随机发生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     
 }

有可能吗? 感谢。

2 个答案:

答案 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