Android textview java lang nullpointerexception

Как понять NullPointerException

Эта простая статья скорее для начинающих разработчиков Java, хотя я нередко вижу и опытных коллег, которые беспомощно глядят на stack trace, сообщающий о NullPointerException (сокращённо NPE), и не могут сделать никаких выводов без отладчика. Разумеется, до NPE своё приложение лучше не доводить: вам помогут null-аннотации, валидация входных параметров и другие способы. Но когда пациент уже болен, надо его лечить, а не капать на мозги, что он ходил зимой без шапки.

Итак, вы узнали, что ваше приложение упало с NPE, и у вас есть только stack trace. Возможно, вам прислал его клиент, или вы сами увидели его в логах. Давайте посмотрим, какие выводы из него можно сделать.

NPE может произойти в трёх случаях:

  1. Его кинули с помощью throw
  2. Кто-то кинул null с помощью throw
  3. Кто-то пытается обратиться по null-ссылке

Во втором и третьем случае message в объекте исключения всегда null, в первом может быть произвольным. К примеру, java.lang.System.setProperty кидает NPE с сообщением «key can’t be null», если вы передали в качестве key null. Если вы каждый входной параметр своих методов проверяете таким же образом и кидаете исключение с понятным сообщением, то вам остаток этой статьи не потребуется.

Обращение по null-ссылке может произойти в следующих случаях:

  1. Вызов нестатического метода класса
  2. Обращение (чтение или запись) к нестатическому полю
  3. Обращение (чтение или запись) к элементу массива
  4. Чтение length у массива
  5. Неявный вызов метода valueOf при анбоксинге (unboxing)

Важно понимать, что эти случаи должны произойти именно в той строчке, на которой заканчивается stack trace, а не где-либо ещё.

Рассмотрим такой код:

Откуда-то был вызван метод handle с какими-то параметрами, и вы получили:

В чём причина исключения — в f, d или d.val? Нетрудно заметить, что f в этой строке вообще не читается, так как метод format статический. Конечно, обращаться к статическому методу через экземпляр класса плохо, но такой код встречается (мог, например, появиться после рефакторинга). Так или иначе значение f не может быть причиной исключения. Если бы d был не null, а d.val — null, тогда бы исключение возникло уже внутри метода format (в девятой строчке). Аналогично проблема не могла быть внутри метода getValue, даже если бы он был сложнее. Раз исключение в пятнадцатой строчке, остаётся одна возможная причина: null в параметре d.

Вот другой пример:

Снова вызываем метод handle и получаем

Теперь метод format нестатический, и f вполне может быть источником ошибки. Зато s не может быть ни под каким соусом: в девятой строке уже было обращение к s. Если бы s было null, исключение бы случилось в девятой строке. Просмотр логики кода перед исключением довольно часто помогает отбросить некоторые варианты.

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

Теперь в самой строчке обращения к полям и методам s нету, а метод equals корректно обрабатывает null, возвращая false, поэтому в таком случае ошибку в двенадцатой строке мог вызвать как f, так и s. Анализируя вышестоящий код, уточняйте в документации или исходниках, как используемые методы и конструкции реагируют на null. Оператор конкатенации строк +, к примеру, никогда не вызывает NPE.

Вот такой код (здесь может играть роль версия Java, я использую Oracle JDK 1.7.0.45):

Вызываем метод dump, получаем такое исключение:

В параметре pw не может быть null, иначе нам не удалось бы войти в метод print. Возможно, null в obj? Легко проверить, что pw.print(null) выводит строку «null» без всяких исключений. Пойдём с конца. Исключение случилось здесь:

В строке 473 возможна только одна причина NPE: обращение к методу length строки s. Значит, s содержит null. Как так могло получиться? Поднимемся по стеку выше:

В метод write передаётся результат вызова метода String.valueOf. В каком случае он может вернуть null?

Единственный возможный вариант — obj не null, но obj.toString() вернул null. Значит, ошибку надо искать в переопределённом методе toString() нашего объекта MyObject. Заметьте, в stack trace MyObject вообще не фигурировал, но проблема именно там. Такой несложный анализ может сэкономить кучу времени на попытки воспроизвести ситуацию в отладчике.

Не стоит забывать и про коварный автобоксинг. Пусть у нас такой код:

И такое исключение:

На первый взгляд единственный вариант — это null в параметре obj. Но следует взглянуть на класс MyContainer:

Мы видим, что getCount() возвращает Integer, который автоматически превращается в int именно в третьей строке TestNPE.java, а значит, если getCount() вернул null, произойдёт именно такое исключение, которое мы видим. Обнаружив класс, подобный классу MyContainer, посмотрите в истории системы контроля версий, кто его автор, и насыпьте ему крошек под одеяло.

Помните, что если метод принимает параметр int, а вы передаёте Integer null, то анбоксинг случится до вызова метода, поэтому NPE будет указывать на строку с вызовом.

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

Источник

Как исправить ошибку java.lang.nullpointerexception?

В этом посте я покажу наглядный пример того, как исправить ошибку исключения Null Pointer (java.lang.nullpointerexception). В Java особое значение null может быть назначено для ссылки на объект и означает, что объект в данный момент указывает неизвестную область данных.

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

Это исключение возникает следующих случаях:

  • Вызов метода из объекта значения null.
  • Доступ или изменение объекта поля null.
  • Принимает длину null(если бы это был массив Java).
  • Доступ или изменение ячеек объекта null.
  • Показывает «0», значение Throwable.
  • При попытке синхронизации по нулевому объекту.

NullPointerException является RuntimeException, и, таким образом, компилятор Javac не заставляет вас использовать блок try-catch для соответствующей обработки.

Зачем нам нужно значение null?

Как уже упоминалось, null – это специальное значение, используемое в Java. Это чрезвычайно полезно при кодировании некоторых шаблонов проектирования, таких как Null Object pattern и шаблон Singleton pattern.

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

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

Читайте также:  Живые обои андроиды механизм

В этом примере мы объявляем статический экземпляр класса Singleton. Этот экземпляр инициализируется не более одного раза внутри метода getInstance.

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

Как избежать исключения Null Pointer

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

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

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

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

  1. Сравнение строк с литералами

Очень распространенный случай, выполнения программы включает сравнение между строковой переменной и литералом. Литерал может быть строкой или элементом Enum.

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

Приведенный выше фрагмент кода вызовет исключение NullPointerException. Однако, если мы вызываем метод из литерала, поток выполнения продолжается нормально:

  1. Проверка аргументов метода

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

В противном случае вы можете вызвать исключение IllegalArgumentException.

  1. Предпочтение метода String.valueOf() вместо of toString()

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

Вместо этого рассмотрите возможность использования статического метода String.valueOf, который не выдает никаких исключений и «ноль», если аргумент функции равен нулю.

  1. Используйте Ternary Operator

Ternary Operator – может быть очень полезным. Оператор имеет вид:

boolean expression ? value1 : value2;

Сначала вычисляется логическое выражение. Если выражение true, то возвращается значение1, в противном случае возвращается значение2. Мы можем использовать Ternary Operator для обработки нулевых указателей следующим образом:

String message = (str == null) ? «» : str.substring(0, 10);

Переменная message будет пустой, если ссылка str равна нулю. В противном случае, если str указывает на фактические данные, в сообщении будут первые 10 символов.

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

Очень хорошая техника – создавать методы, которые возвращают пустую коллекцию вместо нулевого значения. Код вашего приложения может перебирать пустую коллекцию и использовать ее методы и поля. Например:

  1. Воспользуйтесь классом Apache’s StringUtils.

Apache’s Commons Lang – это библиотека, которая предоставляет вспомогательные утилиты для API java.lang, такие как методы манипулирования строками.

Примером класса, который обеспечивает манипулирование String, является StringUtils.java, который спокойно обрабатывает входные строки с нулевым значением.

Вы можете воспользоваться методами: StringUtils.isNotEmpty, StringUtils.IsEmpty и StringUtils.equals, чтобы избежать NullPointerException. Например:

  1. Используйте методы: contains(), containsKey(), containsValue()

Если в коде вашего приложения используется Maps, рассмотрите возможность использования методов contains, containsKey и containsValue. Например, получить значение определенного ключа после того, как вы проверили его существование на карте:

System.out.println(value.toString()); // В приведенном выше фрагменте мы не проверяем, существует ли на самом деле ключ внутри карты, и поэтому возвращаемое значение может быть нулевым. Самый безопасный способ следующий:

  1. Проверьте возвращаемое значение внешних методов

На практике очень часто используются внешние библиотеки. Эти библиотеки содержат методы, которые возвращают ссылку. Убедитесь, что возвращаемая ссылка не пуста.

Утверждения очень полезны при тестировании вашего кода и могут использоваться, чтобы избежать выполнения фрагментов кода. Утверждения Java реализуются с помощью ключевого слова assert и выдают AssertionError.

Обратите внимание, что вы должны включить флажок подтверждения JVM, выполнив его с аргументом -ea. В противном случае утверждения будут полностью проигнорированы.

Примером использования утверждений Java является такая версия кода:

Если вы выполните приведенный выше фрагмент кода и передадите пустой аргумент getLength, появится следующее сообщение об ошибке:
Exception in thread «main» java.lang.AssertionError
Также вы можете использовать класс Assert предоставленный средой тестирования jUnit.

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

Существующие безопасные методы NullPointerException

Доступ к статическим членам или методам класса

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

Это связано с тем, что компилятор Java хранит статические методы и поля в специальном месте во время процедуры компиляции. Статические поля и методы связаны не с объектами, а с именем класса.

Несмотря на тот факт, что экземпляр SampleClass равен нулю, метод будет выполнен правильно. Однако, когда речь идет о статических методах или полях, лучше обращаться к ним статическим способом, например, SampleClass.printMessage ().

Оператор instanceof

Оператор instanceof может использоваться, даже если ссылка на объект равна нулю.

Оператор instanceof возвращает false, когда ссылка равна нулю.

В результате, как и ожидалось:

Not an instance of the String class!

Смотрите видео, чтобы стало понятнее.

Средняя оценка / 5. Количество голосов:

Спасибо, помогите другим — напишите комментарий, добавьте информации к статье.

Или поделись статьей

Видим, что вы не нашли ответ на свой вопрос.

Источник

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

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

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

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

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

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

Первая строка объявляет переменную с именем num , но она не содержит примитивного значения. Вместо этого он содержит указатель (потому что тип Integer является ссылочным типом). Поскольку вы еще не сказали, что указать на Java, он устанавливает значение null, что означает «Я ничего не указываю».

Во второй строке ключевое слово new используется для создания (или создания) объекта типа Integer, а переменной-указателю num присваивается этот объект. Теперь вы можете ссылаться на объект, используя оператор разыменования . (точка).

Exception о котором вы просили, возникает, когда вы объявляете переменную, но не создаете объект. Если вы попытаетесь разыменовать num создания объекта, вы получите NullPointerException . В самых тривиальных случаях компилятор поймает проблему и сообщит вам, что «num может не быть инициализировано», но иногда вы пишете код, который напрямую не создает объект.

Читайте также:  Календарь icloud для android

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

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

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

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

Наконец, как определить местоположение исключения и вызвать использование Stack Trace

Исключение NullPointerException – это исключения, возникающие при попытке использовать ссылку, указывающую на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет NullPointerException . Они наиболее распространены, но другие способы перечислены на странице javadoc NullPointerException .

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

В первой строке внутри main я явно устанавливаю ссылку Object obj равной нулю. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обрабатывать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

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

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

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

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

  • Вызов метода экземпляра нулевого объекта.
  • Доступ или изменение поля нулевого объекта.
  • Принимая длину null, как если бы это был массив.
  • Доступ или изменение слотов null, как если бы это был массив.
  • Бросание нулевого значения, как если бы это было значение Throwable.

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

Также бывает, что если вы попытаетесь использовать нулевую ссылку с synchronized , это также вызовет это исключение для JLS :

  • В противном случае, если значение Expression равно null, NullPointerException .

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

Итак, у вас есть NullPointerException , как вы его исправить? Возьмем простой пример, который вызывает NullPointerException

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

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

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

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

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

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

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

Этого достаточно, чтобы дать нам решение: добавьте вызов printer.setName() перед вызовом printer.print() .

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

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

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

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

Смотрите также:

  • Избежать операторов «! = Null» в Java?

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

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

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

Как вы должны знать, типы Java делятся на примитивные типы ( boolean , int т. Д.) И ссылочные типы . Типы ссылок в Java позволяют использовать специальное значение null которое является способом Java, говорящим «no object».

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

Оператор, помеченный как «ЗДЕСЬ», попытается запустить метод length() в null ссылке, и это вызовет NullPointerException .

Существует много способов использования null значения, которое приведет к NullPointerException . Если факт, единственное, что вы можете сделать с null без возникновения NPE, это:

  • Назначить его ссылочной переменной или прочитать ее из ссылочной переменной,
  • Назначьте его элементу массива или прочитайте его из элемента массива (если эта ссылка массива не равна нулю!),
  • Передать его в качестве параметра или вернуть его в результате или
  • Протестируйте его с помощью операторов == или != Или instanceof .

Вопрос: Как мне узнать стек NPE?

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

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

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

Поэтому давайте посмотрим, что говорит:

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

  • Он сообщает вам имя потока Java, в котором было выбрано исключение. Для простой программы с одним потоком (как этот) она будет «основной». Давайте двигаться дальше …
  • Он сообщает вам полное имя исключения, которое было выбрано; Т.е. java.lang.NullPointerException .
  • Если в исключении имеется связанное сообщение об ошибке, это будет выводиться после имени исключения. В этом отношении NullPointerException необычно, потому что оно редко имеет сообщение об ошибке.

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

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

  • «В Test.main» говорится, что мы были в main методе класса Test .
  • «Test.java:4» дает исходное имя файла для класса, и он сообщает нам, что оператор, где это произошло, находится в строке 4 файла.
Читайте также:  Почему выключается самсунг андроид

И если вы подсчитаете строки в файле выше, строка 4 – это та, которую я обозначил комментарием «ЗДЕСЬ».

Обратите внимание, что в более сложном примере в трассе стека NPE будет много строк. Но вы можете быть уверены, что вторая строка (первая строка «на линии») сообщит вам, куда был выброшен NPE 1 .

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

1 – Не совсем верно. Есть вещи, называемые вложенными исключениями …

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

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

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

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

На самом деле существует только один способ: это может произойти только в том случае, если foo имеет значение null . Затем мы пытаемся запустить метод length() на null и … BANG!

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

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

Итак, откуда это произошло? В этом случае это очевидно, и очевидно, что нам нужно сделать, чтобы исправить это. (Назначьте ненулевое значение для foo )

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

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

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

Итак, глядя на первую строчку, как это может вызвать NPE? Фактически, есть два способа:

  • Если значение bar равно null тогда bar[pos] будет вызывать NPE.
  • Если значение bar[pos] равно null то вызов length() на нем вызовет NPE.

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

Откуда берётся bar ? Это параметр вызова метода test , и если мы посмотрим, как был вызван test , мы можем видеть, что он исходит из статической переменной foo . И мы ясно видим, что мы инициализировали foo на ненулевое значение. Этого достаточно, чтобы условно отвергнуть это объяснение. (Теоретически, что-то еще может изменить foo на null … но здесь этого не происходит).

Так что насчет второго сценария? Хорошо, мы видим, что pos равно 1 , поэтому это означает, что foo[1] должен быть null . Это возможно?

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

Мы выделяем String[] с двумя элементами , которые инициализируются null . И тогда мы не изменили содержимое foo … так что foo[1] все равно будет null .

Исключение нулевого указателя возникает, когда вы разыскиваете переменную, указывающую на null . См. Следующий код:

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

  1. Вызов метода экземпляра null объекта.
  2. Доступ или изменение поля null объекта.
  3. Принимая длину null как если бы это был массив.
  4. Доступ или изменение слотов null как если бы это был массив.
  5. Бросание null как если бы это было значение Throwable.

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

Указатель NULL – это тот, который указывает на никуда. Когда вы разыскиваете указатель p , вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p , nowhere указано, вы говорите« дайте мне данные в месте «Нигде». Очевидно, он не может этого сделать, поэтому он NULL pointer exception .

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

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

См. Также: Хороший список лучших практик

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

Резюме:

  1. Используйте final модификатор для обеспечения хорошей инициализации.
  2. Избегайте возвращать null в методах, например, возвращая пустые коллекции, когда это применимо.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, если они не должны быть нулевыми.
  5. Сначала используйте значения с известным объектом: if(«knownObject».equals(unknownObject)
  6. Предпочитают значение valueOf() над toString ().
  7. Использовать null безопасные методы StringUtils.isEmpty(null) .

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

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

  • Декларация: int a;
  • Инициализация: a=0;

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

  • Декларация: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дали раздел NullpointerException возникает NullpointerException .

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

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

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

Поскольку вы используете Obj_Student но вы забыли его инициализировать, как показано на рисунке ниже.

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

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

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

Объект живет в пространстве памяти VM, и единственный доступ к нему – this использование this ссылок. Возьмем следующий пример:

Это важно знать – когда больше нет ссылок на объект (в приведенном выше примере, когда ссылка «reference» и «otherReference» указывает на null), объект «недоступен». Мы не можем работать с ним, поэтому этот объект помечен для сбора мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.

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

Этот конкретный NPE можно избежать, если порядок сравнения будет отменен; А именно, использовать .equals на гарантированном ненулевом объекте.

Все элементы внутри массива инициализируются общим общим значением ; Для любого типа массив объектов, это означает, что все элементы равны null .

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

Источник

Оцените статью