Хороший способ отладки 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 вниз.