Исключение нулевого указателя в затмении при программировании для Android - PullRequest
0 голосов
/ 15 января 2012

Я знаю, что вопрос немного упрощен, но я чувствую, что упускаю что-то большое и очевидное.Я следую учебник для обработки графики в Android от (http://www.droidnova.com/playing-with-graphics-in-android-part-vi,209.html).Когда я смотрю на logcat, он сообщает мне номер строки, в которой, по его мнению, произошло исключение нулевого указателя) Когда я заменяю числа, извлекаемые из классов, константами, исключение нулевого указателя просто перемещается куда-то еще в программе.

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

Кроме того, когда я пытаюсь установить точки останова для тестирования, в то время как я могукогда отладчик запускается и останавливается на точке останова, logcat показывает, что исключение нулевого указателя все еще было сгенерировано, даже если точка останова должна быть достигнута до появления части, вызывающей исключение.Почему точки останова игнорируются?

1 Ответ

2 голосов
/ 15 января 2012

Есть ли какой-нибудь способ в отладчике затмения определить, какой конкретный указатель он рассматривает как нулевой, если его не должно быть?

Ответ здесь - да и нет. Нет: Вы не можете указать Eclipse указать, на какой указатель проверять наличие нуля.Все, что вы можете сделать, это наблюдать за самими указателями, когда вы сломаны в классе или функции. Да: Все, что вам нужно сделать, это разделить ваши звонки, и вы сможете найти объект.Например, рассматриваемый код кажется следующим:

_currentGraphic.getCoordinates().setX((int) event.getX() - _currentGraphic.getGraphic().getWidth() / 2);

Вы бы разбили это на (простите за псевдо, но я не знаю, с какими типами вы работаете):

Type _coords = _currentGraphic.getCoordinates();
Type _graphic = _currentGraphic.getGraphic();
Type _width = _graphic.getWidth();

_coords.setX((int) event.getX() - _width / 2);

Теперь строка кода разбита на один объект на строку, что позволяет легко определить, кто является нарушителем.

Почему точки останова игнорируются?

Это немного сложнее.Ваши точки останова могут или не могут быть проигнорированы.В общем, если вы добираетесь до одной точки останова, она должна подходить ко всем по порядку.Тем не менее, я заметил в Eclipse, что иногда точки останова игнорируются при определенных обстоятельствах.По некоторым причинам adb не полностью интегрирован с отладчиком Eclipse.Это означает, что если вы измените точки останова в середине запущенной отладки, он может распознавать или не распознавать их.Часто бывает достаточно полностью убить приложение и выполнить повторную отладку.

Кроме того, иногда adb и отладчик не синхронизируются правильно.Есть команда, которую вы можете использовать (лучше всего в начале вашего кода), которая очень хорошо помогает в этом.Если вы вставите команду Debug.waitForDebugger(), произойдет синхронизация, позволяющая корректно работать самым ранним точкам останова (тем, которые были в вашем первом onCreate () и аналогичных).Команда действительно делает вашу отладку намного медленнее.Использование этого в ключевых точках также уменьшит явное игнорирование точки останова, обсуждавшееся ранее.

Теперь важно отметить, что только то, что вы думаете, что игнорирует их, не означает, что это так.Иногда (особенно с Android, прямо сейчас) выполнение не обязательно идет по пути, который разработчик считает, что делает.Например, можно установить точку останова в конструкторе ViewClass(Context context), когда она фактически создается с помощью XML с конструктором ViewClass(Context context, AttributeSet attr).Черт, даже забытое создание объекта может полностью управлять выполнением в неправильном направлении.Это может быть особенно верно, если объект имеет static членов или код, который выполняется при инициализации class (не object initialization).Не глядя на ваш код, я не могу сказать, что происходит, но, надеюсь, это даст вам инструменты, чтобы найти ваш ответ.

Надеюсь, это поможет,

FuzzicalLogic

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