что такое nullpointerexception в java

Что такое NullPointerException и как это исправить

Довольно часто при разработке на Java программисты сталкиваются с NullPointerException, появляющимся в самых неожиданных местах. В этой статье мы разберёмся, как это исправить и как стараться избегать появления NPE в будущем.

NullPointerException – что это такое?

NullPointerException (оно же NPE) это исключение, которое выбрасывается каждый раз, когда вы обращаетесь к методу или полю объекта по ссылке, которая равна null. Разберём простой пример:

Здесь на первой строке мы объявили переменную типа Integer и присвоили ей значение null (то есть переменная не указывает ни на какой существующий объект).
На второй строке мы обращаемся к методу toString переменной n1. Так как переменная равна null, метод не может выполниться (переменная не указывает ни на какой реальный объект), генерируется исключение NullPointerException:

Как исправить NullPointerException

В нашем простейшем примере мы можем исправить NPE, присвоив переменной n1 какой-либо объект (то есть не null):

Теперь не будет исключения при доступе к методу toString и наша программа отработает корректно.

Если ваша программа упала из-за исключение NullPointerException (или вы перехватили его где-либо), вам нужно определить по стектрейсу, какая строка исходного кода стала причиной появления этого исключения. Иногда причина локализуется и исправляется очень быстро, в нетривиальных случаях вам нужно определять, где ранее по коду присваивается значение null.

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

Как избегать исключения NullPointerException

Существует множество техник и инструментов для того, чтобы избегать появления NullPointerException. Рассмотрим наиболее популярные из них.

Проверяйте на null все объекты, которые создаются не вами

Если объект создаётся не вами, иногда его стоит проверять на null, чтобы избегать ситуаций с NullPinterException. Здесь главное определить для себя рамки, в которых объект считается «корректным» и ещё «некорректным» (то есть невалидированным).

Не верьте входящим данным

Если вы получаете на вход данные из чужого источника (ответ из какого-то внешнего сервиса, чтение из файла, ввод данных пользователем), не верьте этим данным. Этот принцип применяется более широко, чем просто выявление ошибок NPE, но выявлять NPE на этом этапе можно и нужно. Проверяйте объекты на null. В более широком смысле проверяйте данные на корректность, и консистентность.

Возвращайте существующие объекты, а не null

Если вы создаёте метод, который возвращает коллекцию объектов – не возвращайте null, возвращайте пустую коллекцию. Если вы возвращаете один объект – иногда удобно пользоваться классом Optional (появился в Java 8).

Заключение

В этой статье мы рассказали, как исправлять ситуации с NullPointerException и как эффективно предотвращать такие ситуации при разработке программ.

Источник

Исключение NullPointerException Java – Обнаружение, исправление и рекомендации

ява.ланг.Исключение NullPointerException является наиболее распространенным исключением в Java. Давайте рассмотрим примеры исключений NullPointerException, как их обнаружить и исправить.

Примеры исключений NullPointerException Java

Давайте рассмотрим некоторые примеры исключения NullPointerException в программах java.

1. Исключение NullPointerException при вызове метода экземпляра

Когда мы запускаем вышеуказанную программу, она выдает следующее сообщение об ошибке NullPointerException.

Мы получаем исключение NullPointerException в операторе t.foo(«Привет»); потому что “t” здесь равно нулю.

2. Исключение Java NullPointerException при доступе/изменении поля нулевого объекта

Приведенная выше программа выдает следующую трассировку стека исключений NullPointerException.

3. Исключение Java NullPointerException при передаче значения null в аргументе метода

Это одно из наиболее распространенных случаев использования java.lang.Исключение NullPointerException потому что вызывающий объект передает аргумент null.

На приведенном ниже рисунке показано исключение нулевого указателя, когда вышеуказанная программа выполняется в среде IDE Eclipse.

4. java.язык.Исключение NullPointerException, когда выбрасывается значение null

5. Исключение NullPointerException при получении длины массива null

6. Исключение NullPointerException при доступе к значению индекса нулевого массива

7. Исключение NullPointerException при синхронизации с нулевым объектом

synchronized(мьютекс) вызовет исключение NullPointerException, поскольку объект “мьютекс” равен нулю.

8. Статус HTTP 500 java.lang.Исключение NullPointerException

Для этого я отредактировал пример проекта Spring MVC и изменил метод HomeController, как показано ниже.

На рисунке ниже показано сообщение об ошибке, вызванное ответом веб – приложения.

Вот трассировка стека исключений:

Основной причиной является исключение NullPointerException в инструкции user.getUserId().toLowerCase() потому что user.getUserId() возвращает значение null.

Как определить java.lang.Исключение NullPointerException

Обнаружить исключение NullPointerException очень просто, просто посмотрите на трассировку исключений, и она покажет вам имя класса и номер строки исключения. Затем посмотрите на код и посмотрите, что может быть null, вызывающим исключение NullPointerException. Просто посмотрите на все вышеприведенные примеры, из трассировки стека очень ясно, что вызывает исключение nullpointerexception.

Как исправить исключение NullPointerException

Рекомендации по кодированию, чтобы избежать исключения NullPointerException

1. Давайте рассмотрим приведенную ниже функцию и рассмотрим сценарий, вызывающий исключение нулевого указателя.

Исключение NullPointerException может возникнуть, если аргумент передается как null. Тот же метод можно записать, как показано ниже, чтобы избежать исключения NullPointerException.

2. Мы также можем добавить нулевую проверку аргумента и выбросить Исключение IllegalArgumentException при необходимости.

3. Мы можем использовать тернарный оператор, как показано в приведенном ниже примере кода.

Приведенный ниже фрагмент кода показывает пример, в котором метод valueOf() используется вместо toString().

5. Напишите методы, возвращающие пустые объекты, а не пустые, где это возможно, например, пустой список, пустую строку и т. Д.

Читайте также:  Выразительное чтение что это такое

6. В классах коллекций определены некоторые методы, чтобы избежать исключения NullPointerException, вы должны их использовать. Например, содержит(), содержит () и содержит значение().

Источник

Что такое исключение NullPointerException и как его исправить?

каковы исключения нулевого указателя ( java.lang.NullPointerException ) и что их вызывает?

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

12 ответов

когда вы объявляете ссылочную переменную (т. е. объект), вы действительно создаете указатель на объект. Рассмотрим следующий код, в котором вы объявляете переменную примитивного типа int :

в этом примере переменная X является int и Java инициализирует его до 0 для вас. Когда вы назначаете его 10 во второй строке, ваше значение 10 записывается в ячейку памяти, на которую указывает x.

но при попытке объявить ссылочный тип происходит что-то другое. Возьмите следующий код:

например, у вас может быть следующий метод:

в этом случае obj равно null. Если метод предназначен для того, чтобы что-то сделать с переданным объектом, он уместно бросить NullPointerException потому что это ошибка программиста, и программисту понадобится эта информация для целей отладки.

в качестве альтернативы могут быть случаи, когда цель метода не только работать с переданным объектом, и поэтому нулевой параметр может быть приемлемым. В этом случае вам нужно будет проверить наличие null параметр и вести себя по-другому. Вы также должны объяснить это в документации. Например, doSomething может быть написано как:

вероятно, самый быстрый пример кода, который я мог придумать, чтобы проиллюстрировать NullPointerException будет быть:

(это формальность, но я думаю, что это медведи упоминание: ссылка, указывающая на null, не совпадает с указателем C, указывающим на недопустимое расположение памяти. Нулевой указатель буквально не указывает в любом месте, что тонко отличается от указания на недопустимое местоположение.)

что такое исключение NullPointerException?

хорошим местом для начала является JavaDocs. Они покрыли это:

брошенный, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

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

как это исправить?

определите значения null

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

здесь мы видим, что исключение выбрасывается в строке 13 (в printString метод). Посмотрите на строку и проверьте, какие значения null по добавление регистрация заявления или через отладчик. Мы узнаем, что s равно null и вызывает length метод бросает исключение. Мы видим, что программа перестает бросать исключение когда s.length() удаляется из метода.

трассировка откуда берутся эти значения

далее проверьте, откуда берется это значение. Следуя вызовам метода, мы видим, что s передается с printString(name) на print() метод, и this.name равно null.

проследить, где эти значения должны быть заданы

где this.name установить? В setName(String) метод. С некоторой больше отладки, мы видно, что этот метод Вообще не вызывается. Если метод был вызван, обязательно проверьте ордер что эти методы вызываются, а метод set не называется после метод печати.

другие исправления

переменная может иметь значение по умолчанию (и setName может допустить того, чтобы null):

или print или printString метод проверка на null, например:

или вы можете создать класс, так что name всегда имеет ненулевое значение:

Читайте также:

я все еще не могу найти проблему

если вы пытались отлаживать у вас все еще нет решения, вы можете задать вопрос для получения дополнительной помощи, но обязательно включите то, что вы пробовали до сих пор. Как минимум, включить stacktrace в вопросе, и отметьте важные номера строк в коде. Кроме того, сначала попробуйте упростить код (см. SSCCE).

вопрос: что вызывает NullPointerException (NPE)?

A NullPointerException бросается во время выполнения, когда ваша программа пытается использовать null как будто это была настоящая ссылка. Например, если вы пишете это:

вопрос: Как я могу прочитать NPE stacktrace?

предположим, что я компилирую и запускаю программу выше:

Итак, давайте посмотрим, что он говорит:

первая строка трассировки стека говорит вам о нескольких вещах:

вторая строка является наиболее важной в диагностике NPE.

это говорит нам о многом:

если вы считаете строки в файле выше, строка 4-это та, которую я обозначил комментарием «Здесь».

короче говоря трассировка стека скажет нам однозначно, какой оператор программы бросил NPE.

вопрос: Как отследить причину исключения NPE в моем коде?

это самая трудная часть. Короткий ответ заключается в применении логического вывода к доказательствам, предоставленным трассировкой стека, исходным кодом и соответствующую документацию API.

давайте сначала проиллюстрируем простым примером (выше). Мы начинаем с просмотра строки, которую трассировка стека сказала нам, где произошло NPE:

как это может бросить NPE?

но (я слышу, как вы говорите) что, если бы NPE был бросили внутрь length() вызов метода?

Ну, если бы это произошло, трассировка стека будет выглядеть иначе. Первая строка » at » скажет, что исключение было брошено в некоторую строку в java.lang.String класс и строка 4 из Test.java будет второй строкой «at».

хорошо, давайте попробуем немного более хитрый пример. Это потребует некоторых логический вывод.

Итак, теперь у нас есть две линии «at». Первый-для этой строки:

Читайте также:  что случилось со звуком на ютубе

и второй для этой строки:

глядя на первую строку, как это может бросить NPE? Есть два способа:—67—>

Далее, нам нужно выяснить, какой из этих сценариев объясняет, что на самом деле происходит. Мы начнем с изучения первого:

действительно! И это проблема. Когда мы инициализируем так:

в это время вы просто объявил этот объект, но не инициализирован или создан экземпляр. И всякий раз, когда вы пытаетесь получить доступ к любому свойству или методу в нем, он будет бросать NullPointerException в этом есть смысл.

исключение нулевого указателя возникает, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

В общем, это потому, что что-то не инициализируется должным образом.

много объяснений уже присутствует, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать лучшие практики избежать NullPointerException на всех.

Я бы добавил, Очень важно, хорошо использовать final модификатор. использование модификатора «final», когда это применимо в Java

резюме:

исключение нулевого указателя-это индикатор того, что вы используете объект без его инициализации.

например, ниже приведен класс student, который будет использовать его в нашем коде.

приведенный ниже код выдает исключение нулевого указателя.

в Java все находится в форме класса.

если вы хотите использовать любой предмет то у вас есть два этапа:

то же самое для концепции массива

если вы не даете раздел инициализации, то NullpointerException возникнуть.

на Java все переменные, которые вы объявляете, на самом деле являются» ссылками » на объекты (или примитивы), а не сами объекты.

когда вы пытаетесь выполнить один метод объекта, ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (nothing, zero, void, nada), то метод не может быть выполнен. Затем среда выполнения дает вам знать об этом, бросая исключение NullPointerException.

объект живет в пространстве памяти виртуальной машины, и единственный способ получить к нему доступ-использовать this ссылки. Возьмем такой пример:

и на другом месте в вашем коде:

еще одно явление NullPointerException происходит, когда объявляется массив объектов, а затем сразу же пытается разыменовать элементы внутри него.

вы должны инициализировать элементы в массиве до доступ или разыменование их.

Источник

Что такое исключение NullPointerException и как его исправить?

Что такое исключения Null Pointer ( java.lang.NullPointerException ) и что их вызывает?

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

ОТВЕТЫ

Ответ 1

Когда вы объявляете ссылочную переменную (т.е. объект), вы действительно создаете указатель на объект. Рассмотрим следующий код, в котором вы объявляете переменную примитивного типа int :

Но когда вы пытаетесь объявить ссылочный тип, происходит что-то другое. Возьмите следующий код:

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

Например, у вас может быть следующий метод:

Альтернативно, могут быть случаи, когда целью метода является не только работа с переданным объектом, и поэтому нулевой параметр может быть приемлемым. В этом случае вам нужно будет проверить нулевой параметр и вести себя по-другому. Вы также должны объяснить это в документации. Например, doSomething() можно записать так:

Ответ 2

(Это техничность, но я думаю, что она упоминает: ссылка, указывающая на нуль, не совпадает с указателем на C, указывающим на недопустимую ячейку памяти. Нулевой указатель буквально не указывает нигде, что тонко отличается от указания на местоположение, которое оказалось недействительным.)

Ответ 3

Что такое исключение NullPointerException?

Хорошим местом для начала является JavaDocs. Они охватывают:

Брошено, когда приложение пытается использовать null в случае, когда объект требуется. К ним относятся:

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

Как это исправить?

Определите нулевые значения

Здесь мы видим, что исключение выбрано в строке 13 (в методе printString ). Посмотрите на строку и проверьте, какие значения равны нулю добавление операторов регистрации или использование отладчика. Мы обнаруживаем, что s имеет значение null, и вызов метода length на нем вызывает исключение. Мы видим, что программа перестает бросать исключение, когда s.length() удаляется из метода.

Трассировка, где эти значения взяты из

Трассировка, где эти значения должны быть установлены

Другие исправления

У переменной может быть значение по умолчанию (и setName может помешать ему установить значение null):

Любой метод print или printString может проверять значение null, например:

Или вы можете создать класс так, чтобы name всегда имел ненулевое значение:

См. также:

Я все еще не могу найти проблему

Если вы попытались отладить проблему и до сих пор не имеете решения, вы можете отправить вопрос для получения дополнительной справки, но не забудьте включить то, что вы пробовали до сих пор. Как минимум, включает stacktrace в вопросе, а отметьте важные номера строк в коде. Также попробуйте сначала упростить код (см. SSCCE).

Ответ 4

Вопрос: Что вызывает NullPointerException (NPE)?

Вопрос: Как я прочитал стек стека NPE?

Предположим, что я компилирую и запускаю программу выше:

Первое наблюдение: компиляция завершается успешно! Проблема в программе НЕ является ошибкой компиляции. Это ошибка времени выполнения. (Некоторые IDE могут предупредить, что ваша программа всегда будет генерировать исключение. но стандартный javac компилятор не делает.)

Читайте также:  Выпускной и последний звонок в чем разница

Второе наблюдение: при запуске программы он выводит две строки «gobbledy-gook». НЕПРАВИЛЬНО!!. Это не ласково. Это stacktrace. и он предоставляет важную информацию, которая поможет вам отследить ошибку в вашем коде, если вы потратите время, чтобы внимательно прочитать ее.

Итак, давайте посмотрим, что он говорит:

Первая строка трассировки стека сообщает вам несколько вещей:

Вторая строка является наиболее важной при диагностике NPE.

Это говорит нам о многом:

Короче говоря, трассировка стека однозначно скажет нам, какая инструкция программы выбрала NPE.

Вопрос: Как определить причину исключения NPE в моем коде?

Это трудная часть. Короткий ответ заключается в применении логического вывода к доказательствам, предоставленным трассировкой стека, исходным кодом и соответствующей документацией API.

Сначала проиллюстрируем простой пример (см. выше). Мы начнем с просмотра строки, о которой рассказывал нам стек, где находится NPE:

Как это может вызвать NPE?

Хорошо, давайте попробуем немного более хитрый пример. Для этого потребуется некоторый логический вывод.

Глядя на первую строчку, как это может вызвать NPE? Существует два способа:

Затем нам нужно выяснить, какой из этих сценариев объясняет, что на самом деле происходит. Мы начнем с изучения первого:

В самом деле, это так! И в этом проблема. Когда мы инициализируем так:

Ответ 5

В это время вы только что объявили этот объект, но не инициализировали или не инстанцировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException что имеет смысл.

См. Также пример ниже:

Ответ 6

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

Ответ 7

В общем, потому что что-то не было правильно инициализировано.

Ответ 8

Краткое описание:

Ответ 9

Например, ниже приведен класс ученика, который будет использовать его в нашем коде.

Код ниже дает исключение нулевого указателя.

Ответ 10

В Java все (кроме примитивных типов) имеет форму класса.

Если вы хотите использовать какой-либо объект, то у вас есть две фазы:

То же самое для концепции массива:

Ответ 11

В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не сами объекты.

Когда вы пытаетесь выполнить один метод объекта, ссылка запрашивает у живого объекта выполнение этого метода. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Затем среда выполнения сообщит вам об этом, выбросив исключение NullPointerException.

Ваша ссылка «указывает» на нуль, таким образом «Null → Pointer».

И на другом месте в вашем коде:

Ответ 12

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разглядеть элементы внутри него.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

Источник

What is a NullPointerException, and how do I fix it?

What are Null Pointer Exceptions ( java.lang.NullPointerException ) and what causes them?

What methods/tools can be used to determine the cause so that you stop the exception from causing the program to terminate prematurely?

12 Answers 12

When you declare a reference variable (i.e., an object), you are really creating a pointer to an object. Consider the following code where you declare a variable of primitive type int :

But, when you try to declare a reference type, something different happens. Take the following code:

The NullPointerException (NPE) occurs when you declare a variable but did not create an object and assign it to the variable before trying to use the contents of the variable (called dereferencing). So you are pointing to something that does not actually exist.

For instance, you may have a method as follows:

If the method is intended to do something to the passed-in object as the above method does, it is appropriate to throw the NullPointerException because it’s a programmer error and the programmer will need that information for debugging purposes.

In addition to NullPointerException s thrown as a result of the method’s logic, you can also check the method arguments for null values and throw NPEs explicitly by adding something like the following near the beginning of a method:

Alternatively, there may be cases where the purpose of the method is not solely to operate on the passed in object, and therefore a null parameter may be acceptable. In this case, you would need to check for a null parameter and behave differently. You should also explain this in the documentation. For example, doSomething() could be written as:

What methods/tools can be used to determine the cause so that you stop the exception from causing the program to terminate prematurely?

Now Java 14 has added a new language feature to show the root cause of NullPointerException. This language feature has been part of SAP commercial JVM since 2006.

In Java 14, the following is a sample NullPointerException Exception message:

Источник

Универсальный бизнес портал