Как я могу отладить это исключение NullPointer?
Я пытаюсь написать приложение для Android, и когда я запускаю свою новую активность, я установил точки останова и обнаружил, что он работает через мой onCreate без каких-либо ошибок, но после того, как эта функция вернется, отладчик говорит, что есть исключение NullPointer. Проблема в том, что он не в моем коде, он говорит об этом в строке ActivityThread.performLaunchActivity(ActivityThread $ActivityRecord): 2268 и где источником обычно будет (если бы это был мой код), я просто получаю "Источник не найден". и кнопку с надписью "Изменить путь поиска источника"
Как настроить eclipse, чтобы я мог отладить эту проблему? Я уверен, что я делаю что-то не так в своем коде, но поскольку исключение возникает из кода, который я не вижу, я понятия не имею, как определить, где проблема.
Я использую android-sdk-linux_x86-1.5_r3 и мой G1 для этого проекта.
UPDATE: Я думаю, что мой вопрос действительно имеет больше общего с развитием Android, чем с использованием eclipse. Я не уверен, где найти источник кода, который бросает исключение. Возможно, есть способ отлаживать его, не имея этого файла, но я не уверен, что это будет.
Ответы
Ответ 1
Ваше предположение должно быть NPE вызвано вами, а не Android. NPE может появиться в ActivityThread.performLaunchActivity(ActivityThread$ActivityRecord) line: 2268
, но это означает, что вы передали нулевой указатель на что-то, и он продолжал проходить до тех пор, пока performLaunchActivity
не попытался использовать его и не разбился, когда обнаружил нулевой указатель.
Если мы увидим полный LogCat, особенно все в красном в Eclipse LogCat, это поможет отладить. Я повернул себя наизнанку, ища NPE только для кого-то другого, чтобы найти очень тонкую линию инициализации ресурсов на месте.
Ответ 2
Интересно это, и хотя он показал "вызванный" в logcat, я хотел, чтобы отладчик фактически разбился, где был сброшен NullPointer (хотя он был пойман)
Вот как:
- Выполнить → Добавить точку исключения исключений Java
- Найти NullPointerException (или что-нибудь еще, что вы могли бы отлаживать (исключение "Caused by" )
- Убедитесь, что отмечен параметр Suspend On Caught Exceptions. Нажмите "ОК".
- Вы должны увидеть новую точку останова в своем представлении
Попробуйте запустить его сейчас, и отладчик должен сломаться там, где он на самом деле происходит.
Ответ 3
кнопка, которая говорит "Изменить путь поиска источника"
Нажмите эту кнопку и сообщите Eclipse, где найти исходный код для этого метода. Это должно помочь. По крайней мере, вы сможете войти в него в отладчик и прочитать что-то более разумное.
Ответ 4
Вы можете показать полный стек вызовов?
Обычно, по крайней мере, с Android, исключение вызывает две отдельные трассы. Первый бесполезен. Второй, отмеченный "Причиной исключения", является тем, который вы хотите.
И даже если ни одна трассировка стека не имеет вашего кода, мы можем узнать что-то, увидев все это.
Ответ 5
Я не работал с Andriod, но Eclipse должен был показать вам стек вызовов. Посмотрите, где программа выходит из вашего кода и входит в чужие, и убедитесь, что все ваши переменные правильны (не нуль, содержат "правильные" данные и т.д.).
Ответ 6
Даже если это происходит в коде Android, вы все равно сможете сузить время, в котором оно происходит, и какие из ваших переменных ему не нравятся. Да, смутный ответ, не более того, чтобы сказать. Или загрузите источник и скажите Eclipse, где он находится.
Ответ 7
Если вы хотите увидеть место, где исключение происходит без загрузки исходного кода Android, есть хороший плагин для eclipse, называемый GrepCode. Он ищет и отображает исходный код популярных Java-проектов в Интернете.