Я случайно получил 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
}
Возможно ли это? Спасибо.
Нет, чтобы return null;
не выбрал NullPointerException
.
IMO, наиболее вероятным объяснением является то, что исходный код Java, на который вы смотрите, не соответствует исполняемому коду; то есть, что строка 166 исходного кода, который был фактически скомпилирован, не является той строкой.
Если MessageQueue
- это класс Android, это может быть проблемой, которую отмечает @Thilo; т.е. версия Android SDK не соответствует версии устройства Android, которую вы пытаетесь отладить.
(И теперь, когда я смотрю более внимательно, MessageQueue
- это класс Android: имя пакета говорит так четко. Duh!)
В противном случае внимательно изучите способ создания и развертывания приложения на устройстве.
(Теоретически возможно, что ошибка в компиляторе Java или в Davlik приводит к тому, что трассировки стека неправильно сообщают номера строк. Но я думаю, что это объяснение маловероятно. Такая ошибка, которая была бы найдена/исправлена в бета-тестирование или что мы бы слышали о...)
Предполагая, что тело метода правильное и что только номер строки неверен, тогда единственная возможная причина NPE в любом месте этого конкретного метода заключается в том, что msg.when
на самом деле является Long
и является null
, который в поворот не может быть распакован на Long
.
Я бы по крайней мере исправил инструкцию if
.
if (msg.when != null && now >= msg.when) {