Eclipse Android Debugger - Где в моем коде я вызвал исключение? - PullRequest
15 голосов
/ 04 февраля 2011

По общему признанию, мой вопрос в основном такой же, как этот, но, похоже, он остался без ответа:

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.

Ответы [ 4 ]

2 голосов
/ 04 февраля 2011

Я запустил ваш точный код, и LogCat дал мне следующие исключения:

Caused by: java.lang.NullPointerException
    at mypackage.test.TestActivity.onCreate(TestActivity.java:23)

Конечно, это

iDareYou.byteValue();

заявление. Это ясно, как яркий день!

Я предлагаю вам научиться правильно использовать Dalvik Debug Monitor Server .

Журнал, который вы опубликовали, кажется довольно бесполезным, вы испортили некоторые фильтры LogCat (это случилось со мной однажды)?

OFFTOPIC: «Где в моем коде я вызвал исключение?» - Я думаю, что ваш вопрос не очень хорошо сформулирован.

Я думаю, что правильное название этого вопроса может быть - «Как использовать отладчик Android и LogCat? Некоторые исключения не зарегистрированы должным образом! '

1 голос
/ 30 июня 2011

В Eclipse Android SDK предоставляет несколько представлений. Он называется "LogCat" . Там вы можете найти следы стека исключений

0 голосов
/ 13 сентября 2012

По моему опыту, Android поглощает исключения, вызванные надуванием макета. Это, безусловно, должно сообщить об исключении, но, видимо, некоторые разработчики Android с грустью решили поймать его и создать новое - без добавления первого как причина . Я рассматриваю это как недостаток среды Android; поскольку может быть трудно связаться с командой Android, с которой я жил до сих пор, но я бы сообщил об этом в Google, если это действительно беспокоит меня.

0 голосов
/ 22 августа 2012

iDareYou.byteValue ();

При вызове этого значения с нулевым значением возникает проблема, если вы хотите преобразовать, я рекомендую попробовать это: С преобразованием int в байтв андроиде

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...