Я использую eclipse и программирую в java. Иногда я сталкиваюсь с исключением nullPointerException, которое поразит меня часами. Нужно ли еще лучше отлаживать свойства nullPointerExceptions и выяснить, какие значения переменных и другие вещи могут вызвать ненужные исключения указателя.
Хороший способ отладки nullPointerException
Ответ 1
Посмотрите на трассировку стека и прочитайте номер строки, где вызывается NullPointerException
. Почти всегда строка имеет некоторый вызов метода, например
x.getValue()
Если x
- null
, вы получите NullPointerException
. Если метод в верхней части трассировки стека не является вашим кодом, проследите стек до тех пор, пока вы не достигнете своего кода. Очень часто в этом случае вы передаете null
методу, который не нравится null
. Найдите его и исправьте.
Кроме того, очень часто, когда вы сталкиваетесь с методом, который не является вашим, который бросает NullPointerException
, прочитайте документацию. Например, посмотрите String.replace(CharSequence target, CharSequence replacement)
:
Выдает
NullPointerException
- еслиtarget
илиreplacement
-null
.
Это не намного понятнее!
Вот пример:
В строке 4 мы видим foo.bar()
. Отсюда следует, что foo
null
. Это легко. Рассмотрим другой пример:
Отслеживая ваш код, мы видим, что s.replace(target, replacement)
бросает. Мы должны проверить target
и replacement
. Подключите отладчик:
Ага! replacement
- null
. Вы можете сделать то же самое в Eclipse. Установите контрольную точку для того, когда выбрано исключение, и используйте ее для проверки параметров для вашего метода. Я примитивен здесь, потому что я родом из школы мысли, где я искренне верю, что всем было бы лучше, если бы они научились делать это с трудом. Жесткие абстракции и все такое.
Ответ 2
-
Во время отладки вы можете использовать представление
BreakPoints
для захвата нулевого указатели.Окно → Показать вид → Точки останова
В представлении есть
"J!"
, который позволяет устанавливать точки останова на исключения. Вы можете установитьjava.lang.NullPointerException
. Итак, раз исключение null-указателя, вы можете проверить, какая переменная вызывает нуль. -
Другое, что вы можете сделать, это захватить доступ к нулевому указателю во время кодирования. Вне курса вы не можете захватить все нулевые указатели, используя эту настройку. Но все же его полезно, установите следующие настройки в своем затмении.
Настройки → Java → Компилятор → Ошибки/предупреждения → Нулевой анализ
Ответ 3
Есть несколько способов уменьшить NullPointerException
проблему:
-
Используйте @Nullable аннотацию.
-
Проверьте значения аргументов для
null
в конструкторах и сеттерах (избегайте настройки в обычном старом Java-коде). Если вы это сделаете, вы можете создать шаблон исходного кода Eclipse, чтобы быстро генерировать код. Это называется "failfast" - вы не дожидаетесь, когда будет генерироваться исключение, когда значение будет использоваться далее в коде, например. после сохранения его в поле. -
Убедитесь, что вы выполняете минимальную сумму (например, 1 или 2) операций на строку. Если вы этого не сделаете, вам придется выяснить, где в выражении одной строки произошел
NullPointerException
. -
Не используйте
null
в полях для указания состояния. Вместо этого используйте, например, aenum State
. Например. не делайтеif (socket == null) { // not connected }
, так как легко забыть проверитьnull
позже. Явное состояние не так легко забыть. -
Не инициализируйте локальные переменные
null
, если это явно не требуется. Фактически, если вы правильно обрабатываете область видимости и исключения, вы должны иметь возможность отмечать большинство переменныхfinal
. Замена методовprintStacktrace()
по умолчанию с помощьюthrow new IllegalStateException("Unhandled program state", e)
помогает, потому что это рассматривается как точка выхода кодового блока.
После большого количества программ вы найдете число NullPointerException
вниз.