Eclipse Android Debugger - Где в моем коде я вызываю исключение?

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

NullPointerException в handleStopActivity - Нет ссылки на мой код в трассировке стека

Скачан Eclipse Helios, плагин для разработчиков Android и 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 Debug не отображается полезная трассировка стека. Тем не менее, на этом этапе в LogCat выводится трассировка стека, которую я вставил выше. Следующие три уникальные строки трассировки стека NPE в моем коде выводятся в LogCat. Я ранее смотрел, чтобы увидеть, есть ли в LogCat что-нибудь, что я мог бы использовать, но, скорее всего, это было до того, как я нажал "возобновить" в отладчике, чтобы переместить процесс в это состояние. К сожалению, хотя это делает так, что никогда не отображает трассировку стека NPE в моем коде в фактическом отладчике.

Но новость не так уж плоха - из информации в окне "Переменные" справа, я вижу, что в текущей области потока есть NPE, поэтому, по крайней мере, дайте мне понять, что NPE (и, конечно, LogCat).

Итак, основываясь на предположении в другой теме, лучшая работа, которую я нашел, - добавить точку останова "Caught and Uncaught" для NullPointerException. Когда я это делаю и перезапускаю, отладчик отображает трассировку стека NPE в моем коде и перемещает окно редактирования прямо в строку, где я вызвал NPE.

В настоящий момент я считаю, что это связано с тем, что NPE захватывается (и, предположительно, снова бросается) на платформу Android. Похоже, что исходная дилемма была вызвана тем фактом, что в окне Eclipse/ADT/DalvikVM Debug Stack Trace нет информации "из-за" (насколько я могу судить), которая отображается в трассировке стека "позже" появляется в LogCat. Далее я буду исследовать, можно ли это исправить:)

Я ценю предложение Bert F, поскольку я не был полностью осведомлен о том, что поток еще не был в его "окончательном" состоянии. Хотя верно, что трассировка стека [позже] отображается в LogCat, я не "пропустил" ее в LogCat, потому что она еще не была [там], я пропустил "возобновление", что вызвало бы трассировку стека для вывода в LogCat.

Несмотря на то, что я первоначально получил отладчик, чтобы остановиться на строке в моем коде с помощью точки останова, есть случай, когда я мог бы в конечном итоге получить трассировку стека в LogCat после возобновления потока, который бы эффективно разрешил проблема. Единственное, что я мог бы попросить, - это отключение отладчика в строке моего кода, вызывающее исключение, вместо того, чтобы быть пойманным, а затем повторно брошен платформой Android. Но я считаю, что это был бы другой вопрос:) И Eclipse, будучи полезным как есть, отправит меня туда, если я нажму на соответствующую строку в трассировке стека, отображаемую в окне LogCat.

Ответы

Ответ 1

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

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

Конечно, это

iDareYou.byteValue();

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

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

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

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

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

Ответ 2

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

Ответ 3

iDareYou.byteValue();

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

Ответ 4

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