По общему признанию, мой вопрос в основном такой же, как этот, но, похоже, он остался без ответа:
NullPointerException в handleStopActivity - нет ссылки на мой код в трассировке стека
Загруженные Eclipse Helios, плагин Android Developer Tools и JDK - все за последнюю неделю. Я возился с приложением на моем устройстве, запустил его в режиме отладки, и оно неожиданно завершилось. Я понял, что вызвал исключение NullPointerException, и сама проблема не была проблемой очень долго.
Однако проблема в том, что отладчик не может определить, где в моем коде было сгенерировано исключение. Трассировка стека не ссылается на мой код.
Действительно, если я добавлю следующее в метод OnCreate()
, я получу ту же проблему
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//lI("onCreate()"); //A silly logging thing I messed around with
Integer iDareYou = null;
iDareYou.byteValue();
Во многом заслуга Eclipse, безусловно, предупреждает меня о том, что код, вероятно, взорвется мне в лицо. Но когда я действительно запускаю это на своем устройстве, возвращается трассировка стека:
Thread [<1> main] (Suspended (exception RuntimeException))
ActivityThread.performLaunchActivity(ActivityThread$ActivityRecord, Intent) line: 2787
ActivityThread.handleLaunchActivity(ActivityThread$ActivityRecord, Intent) line: 2803
ActivityThread.access$2300(ActivityThread, ActivityThread$ActivityRecord, Intent) line: 135
ActivityThread$H.handleMessage(Message) line: 2136
ActivityThread$H(Handler).dispatchMessage(Message) line: 99
Looper.loop() line: 144
ActivityThread.main(String[]) line: 4937
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]
Method.invoke(Object, Object...) line: 521
ZygoteInit$MethodAndArgsCaller.run() line: 868
ZygoteInit.main(String[]) line: 626
NativeStart.main(String[]) line: not available [native method]
Я искал ответы на некоторые вопросы, и, к сожалению, все, что я мог придумать, это вопросы «Почему мое Android-приложение вызывает исключение NullPointerException»? разнообразие.
Я надеюсь выяснить, что я должен делать по-другому, чтобы иметь возможность найти в своем коде точку, где я вызвал исключение .... потому что я уверен, что эта возможность пригодится в некоторых случаях точка в будущее!
Собираюсь отредактировать это, чтобы добавить некоторую информацию. Как упоминается в первом комментарии ниже, состояние, в котором отладчик приостанавливает поток, не является «конечным» состоянием приложения. Нажатие «возобновить» пару раз перемещает процесс до точки, где процесс фактически завершается, хотя, к сожалению, в окне отладки Eclipse / ADT не отображается полезная трассировка стека. Однако , на этом этапе трассировка стека, которую я вставил выше , сопровождаемая , первые 3 уникальные строки трассировки стека NPE в моем коде выводятся в LogCat. Ранее я проверял, есть ли в LogCat что-либо, что я мог бы использовать, но, скорее всего, это было до того, как я нажал «возобновить» в отладчике, чтобы перевести процесс в это состояние. К сожалению, выполнение этого способа никогда не отображает трассировку стека NPE в моем коде в реальном отладчике.
Но новости не все плохие - из информации в окне «Переменные» справа я могу видеть, что в текущей области потока есть NPE, так что это, по крайней мере, дало бы мне понять, что NPE является происходит (и, конечно, есть LogCat).
Поэтому, основываясь на предложении в другой теме, лучшая работа, которую я нашел, состоит в том, чтобы добавить точку прерывания «Пойманный и неучтенный» для исключения NullPointerException. Когда я делаю это и перезапускаюсь, отладчик отображает трассировку стека NPE в моем коде и перемещает окно редактирования прямо на строку, где я вызвал NPE.
В настоящий момент я считаю, что это потому, что NPE перехватывается (и, по-видимому, снова выбрасывается) платформой Android. Похоже, первоначальная дилемма была вызвана тем, что в окне трассировки стека отладки Eclipse / ADT / DalvikVM нет информации «вызвано» (насколько я могу судить), которая отображается в трассировке стека »позже "появляется в LogCat . Далее я выясню, можно ли это исправить:)
Я ценю предложение Берта Ф., так как я не до конца осознавал, что поток еще не был в «окончательном» состоянии. Хотя верно, что трассировка стека [позже] отображается в LogCat, я не «пропустил» ее в LogCat, потому что ее там еще не было, но я пропустил нажатие кнопки «резюме», которое вызвало бы трассировку стека. выводиться в LogCat.
Несмотря на то, что я изначально заставил отладчик останавливаться на строке в моем коде, используя точку останова, есть случай для факта, что я мог в конечном итоге получить трассировку стека в LogCat после возобновления потока, что могло бы эффективно решить эта проблема. Единственное, что я мог бы действительно попросить, - это остановить отладчик на строке в моем коде, вызвавшей исключение, вместо того, чтобы перехватывать его и затем повторно вызывать платформой Android. Но я считаю, что это был бы другой вопрос :) И Eclipse, будучи полезным, отправит меня туда, если я нажму на соответствующую строку в трассировке стека, отображаемой в окне LogCat.