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