Является ли это возможным? получил NullPointerException, когда «вернуть ноль»

1

Я случайно получил 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
    Вы уверены, что у вас есть правильный исходный файл? Версия на устройстве может отличаться от версии в SDK. Показанная вами строка не может выдать исключение NullPointerException.
Теги:

2 ответа

3

Нет, чтобы return null; не выбрал NullPointerException.

IMO, наиболее вероятным объяснением является то, что исходный код Java, на который вы смотрите, не соответствует исполняемому коду; то есть, что строка 166 исходного кода, который был фактически скомпилирован, не является той строкой.

  • Если MessageQueue - это класс Android, это может быть проблемой, которую отмечает @Thilo; т.е. версия Android SDK не соответствует версии устройства Android, которую вы пытаетесь отладить.

    (И теперь, когда я смотрю более внимательно, MessageQueue - это класс Android: имя пакета говорит так четко. Duh!)

  • В противном случае внимательно изучите способ создания и развертывания приложения на устройстве.

(Теоретически возможно, что ошибка в компиляторе Java или в Davlik приводит к тому, что трассировки стека неправильно сообщают номера строк. Но я думаю, что это объяснение маловероятно. Такая ошибка, которая была бы найдена/исправлена ​​в бета-тестирование или что мы бы слышали о...)

  • 0
    Он, вероятно, имеет неправильный исходный файл. Версия на устройстве может отличаться от версии в SDK.
  • 0
    Я также хочу верить, что я получил неправильный исходный код ... Но изображение построено мной, и поэтому я уверен, что это правильное количество строк.
Показать ещё 2 комментария
2

Предполагая, что тело метода правильное и что только номер строки неверен, тогда единственная возможная причина NPE в любом месте этого конкретного метода заключается в том, что msg.when на самом деле является Long и является null, который в поворот не может быть распакован на Long.

Я бы по крайней мере исправил инструкцию if.

if (msg.when != null && now >= msg.when) {

Ещё вопросы

Сообщество Overcoder
Наверх
Меню