Как я могу отладить это исключение NullPointer? - PullRequest
13 голосов
/ 02 августа 2009

Я пытаюсь написать приложение для Android, и когда я запускаю свое новое действие, я установил точки останова и обнаружил, что оно проходит через мой onCreate без каких-либо ошибок, но после того, как эта функция возвращается, отладчик говорит, что есть исключение NullPointer. Проблема в том, что его нет в моем коде, он говорит в строке ActivityThread.performLaunchActivity (ActivityThread $ ActivityRecord): 2268, и где обычно находится источник (если бы это был мой код), я просто получаю «Источник не найден» и кнопка с надписью «Изменить исходный путь поиска»

Как мне настроить eclipse, чтобы я мог отладить эту проблему? Я уверен, что я делаю что-то не так в своем коде, но поскольку исключение происходит из кода, который я не вижу, я понятия не имею, как выяснить, в чем проблема.

Я использую android-sdk-linux_x86-1.5_r3 и мой G1 для этого проекта.

ОБНОВЛЕНИЕ: Я думаю, что мой вопрос на самом деле больше связан с разработкой Android, чем с использованием Eclipse. Я не уверен, где найти источник кода, который вызывает исключение. Может быть, есть способ отладить его без этого файла, но я не уверен, что это будет.

Ответы [ 7 ]

55 голосов
/ 23 ноября 2009

Мне самому было интересно, и хотя в logcat показывалось «вызвано», я хотел, чтобы отладчик действительно сломал место, где был брошен NullPointer (даже если его перехватывали)

Вот как:

  1. Выполнить -> Добавить точку исключения Java
  2. Найти исключение NullPointerException (или что-либо еще, что вы могли бы отлаживать (исключение "Вызвано")
  3. Убедитесь, что установлен флажок Приостановить при обнаружении исключений. Нажмите ОК.
  4. Вы должны увидеть новую точку останова в своем представлении

Попробуйте запустить его сейчас, и отладчик должен сломаться там, где он на самом деле происходит.

3 голосов
/ 02 августа 2009

Предполагается, что NPE вызвано вами, а не Android. NPE может появиться на ActivityThread.performLaunchActivity(ActivityThread$ActivityRecord) line: 2268, но это означает, что вы передали нулевой указатель на что-то, и он продолжал передаваться до тех пор, пока performLaunchActivity фактически не попытался его использовать и не потерпел крах, когда обнаружил нулевой указатель.

Если мы увидим полный LogCat, особенно весь красный в Eclipse LogCat, это поможет отладке. Я вывернул себя наизнанку в поисках NPE только для того, чтобы кто-то другой нашел очень тонкую линию инициализации ресурса не на своем месте.

2 голосов
/ 02 августа 2009

Не могли бы вы показать полный стек вызовов?

Обычно, по крайней мере для Android, исключение запускает две отдельные трассы. Первый бесполезен. Второй, отмеченный «Причиной исключения», - это тот, который вам нужен.

И, даже если ни у одной трассировки стека нет вашего кода, мы можем что-то распознать, увидев все это.

2 голосов
/ 02 августа 2009

кнопка с надписью «Изменить исходный путь поиска»

Нажмите эту кнопку и скажите Eclipse, где найти исходный код для этого метода. Это должно помочь. По крайней мере, вы сможете войти в него в отладчике и прочитать что-нибудь более разумное.

1 голос
/ 02 августа 2009

Я не работал с Andriod, но Eclipse должен быть в состоянии показать вам стек вызовов. Посмотрите на точку, где программа выходит из вашего кода и вводит чужой код, и убедитесь, что все ваши переменные верны (не нулевые, содержат «правильные» данные и т. Д.).

0 голосов
/ 18 марта 2011

Если вы хотите увидеть место, где происходит исключение, без загрузки исходного кода Android, есть хороший плагин для eclipse под названием GrepCode . Он ищет и отображает исходный код популярных Java-проектов в Интернете.

0 голосов
/ 02 августа 2009

Даже если это происходит в коде Android, вы все равно должны иметь возможность сузить, в какой момент это происходит и какие переменные вам не нравятся. Да, смутный ответ, больше нечего сказать. Или загрузите исходный код и скажите Eclipse, где он находится.

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