NullPointerException
может быть выброшено по нескольким различным сценариям.Из документации:
Выдается, когда приложение пытается использовать null
в случае, когда требуется объект.К ним относятся:
- Вызов метода экземпляра объекта
null
. - Доступ или изменение поля объекта
null
. - Получение длины
null
, как будто это массив. - Доступ или изменение слотов
null
, как если бы это был массив. - Бросок
null
, как если бы это был Throwable
значение.
Приложения должны генерировать экземпляры этого класса, чтобы указать на другое незаконное использование объекта null
.
Как и в любом исключении, вы должны внимательно изучить трассировку стека, чтобы выяснить, есть ли какая-либо полезная информация о том, почему он был брошен.Если на самом деле это вызвано незаконным доступом к ссылке null
, как если бы это был реальный объект, тогда общий подход к устранению проблем такого рода состоит в том, чтобы разбить выражения вроде этого:
// chained method invokations, can be hard to debug
var.method1().method2(arg).method3()
Intoнесколько утверждений, подобных этому:
// broken into multiple assignments
var1 = var.method1();
var2 = var1.method2();
var3 = var2.method3();
Теперь, когда возникает NullPointerException
, вы будете знать точную часть цепочки, которая его выбрасывает, а именно, какая var
равна null
.
Идентификация , где , быстро сужает поиск , почему .Если var
само по себе null
, проследите его до предыдущих назначений.Если varN
равно null
, найдите документацию для methodN()
, чтобы узнать, при каких обстоятельствах он может вернуть null
.
Если null
происходит из операции типа get
в структуре контейнера / изменяемых данных проблема больше не так аккуратно локализована, и вам придется выяснить, где произошла соответствующая set
.Если null
никогда не является допустимым значением для этого контейнера, то, возможно, он должен выполнить проверку null
во время set
: всегда лучше вызывать сбой раньше, чем позже, потому что источник ошибки может быть локализован большелегко.
Смежные вопросы
Об отладке NullPointerException
:
О поведении приложения для броска NullPointerException
:
В других NullPointerException
сценариях, поучительных для обучения:
На null
сам по себе: