Вызывайте методы equals() и equals. Ignore. Case() у известной строки литерала, а не у неизвестного объекта. Всегда вызывайте метод equals() у известной строки, про которую вы знаете, что она не null. Метод equals() симметричен, то есть вызов a. Одним из побочных эффектов этого становится Null. Pointer. Exception, в случае если метод вызывается у null. Object unknown. Object = null.
Null. Pointer. Exception. Object. equals(. Особенно это касается классов оберток, таких как Integer, Float, Double или Big. Decimal. Big. Decimal bd = get.
Price(). System. out. String. value. Of(bd)); //не выбрасывает NPE. System. out. println(bd. String()); //выбрасывает .
Одна из наиболее распространенных — String. Utils от Apache Commons. Используя такие методы как String. Utils. is. Blank(), is.
Numeric(), is. White. Space() и т. д. Это еще один из лучших Java приемов, который, не требуя значительных усилий, ведет к огромным улучшениям. Старайтесь не возвращать null из метода, лучше верните пустую коллекцию. Это еще один хороший совет по программированию на Java, который Джошуа Блох описывает в своей книге «Java. Эффективное программирование». Возвращая пустые коллекции или массивы, убедитесь, что при вызове базовых методов вроде size() или length() не возникнет Null. Pointer. Exception.
В классе Collections специально объявлены удобные реализации пустых списков, множеств и словарей: Collections. EMPTY. Например: public List get. Orders(Customer customer). Современные компиляторы и IDE могут использовать эти аннотации для анализы вашего кода и выдавать соответствующие советы, например, о пропущенной проверке на null, или наоборот, о возможности убрать лишнюю проверку, засоряющую код. Такие аннотации, например, поддерживают Intelli.
J IDE и Find. Bugs, кроме этого они входят в JSR 3. Но даже если ваша IDE и не поддерживает такие аннотации, они сами по себе будут хорошей документацией.
Глядя на @Not. Null и @Nullable программисту будет проще понять где нужно добавлять проверку на null, а где — нет. Это, кстати, довольно новая среди Java программистов практика, и должно пройти время, чтобы она распространилась. Избегайте ненужной автоупаковки и автораспаковки в вашем коде. Мало того, что это ведет к созданию лишних временных объектов, автоупаковка еще может вызывать Null. Pointer. Exception, если класс обертки — null. Например, следующий код «свалится» в Null. Pointer. Exception, если запись о человеке не содержит телефона и возвращает null.
Person ram = new Person(. Большинство исключений Null. Pointer. Exception возникают тогда, когда объект пытаются создать, не обладая всеми необходимыми для него данными и зависимостями.
Запретив создание незавершенных объектов, изящно отклоняя подобные запросы, вы избавите себя в будущем от большого числа Null. Pointer. Exception. Аналогично, если вы разрешаете создание объекта, то вы должны подобрать разумное значение по- умолчанию.
Например, объект класса Employee не может быть создан без имени и id, но может не иметь номер телефона. В таком случае у объектов Employee, лишенных номера, вместо null может возвращаться ноль. Хотя подобное поведение объекта стоит заранее продумать — быть может, что проще будет проверить на null, нежели звонить по несуществующему номеру. В таком случае наличие дополнительных условий на то, какие поля null, а какие — нет, поможет принять правильное решение. В целом выбор между немедленным падением программы или присвоением null — это важное решение в проектировании, и сделав выбор вы должны ему последовательно следовать. Задавайте ограничения на уровне СУБД Используя базу данных для хранения объектов вашей программы, таких как покупатели (Customers) или заказы (Orders), будет разумно задать «null- овость» ваших объектов на уровне СУБД, при помощи соответствующих ограничений на таблицы. Базы данных часто содержат информацию из разных источников, и введение проверок на пропущенные значения повысит целостность ваших данных.
Кроме этого наличие проверок на null на уровне СУБД, уменьшит их в вашем Java коде: загружая данные из БД в Java- объекты, вы можете быть уверены в их наличии и убрать лишние . Предположим, что какой- то метод в нашем приложении возвращает объект, с которым впоследствии работает программа, вызавая его методы. Например, метод Collection. Iterator, который используется для прохода по коллекции. Тогда если у изначального объекта нет никакого итератора, вместо null можно вернуть специальный Null- объект, у которого есть метод has.
Next(), всегда возвращающий false. Вот и все дорогой читатель, на этом я заканчиваю свои советы по избавлению Java программ от ошибок Null. Pointer. Exception. Вы оцените, на сколько могут быть полезны эти простые и не обременительные правила. Напоминаю, что если вы хотите поделиться какими- то еще приемами по Null. Pointer. Exception в программах на Java, не стесняйтесь делать это в комментариях. Переведено специально для студентов Java.
Как понять Null. Pointer. Exception / Хабрахабр. Эта простая статья скорее для начинающих разработчиков Java, хотя я нередко вижу и опытных коллег, которые беспомощно глядят на stack trace, сообщающий о Null. Pointer. Exception (сокращённо NPE), и не могут сделать никаких выводов без отладчика. Разумеется, до NPE своё приложение лучше не доводить: вам помогут null- аннотации, валидация входных параметров и другие способы. Но когда пациент уже болен, надо его лечить, а не капать на мозги, что он ходил зимой без шапки. Итак, вы узнали, что ваше приложение упало с NPE, и у вас есть только stack trace.
Возможно, вам прислал его клиент, или вы сами увидели его в логах. Давайте посмотрим, какие выводы из него можно сделать. NPE может произойти в трёх случаях: Его кинули с помощью throw.
Кто- то кинул null с помощью throw. Кто- то пытается обратиться по null- ссылке. Во втором и третьем случае message в объекте исключения всегда null, в первом может быть произвольным. К примеру, java. lang. System. set. Property кидает NPE с сообщением «key can't be null», если вы передали в качестве key null.
Если вы каждый входной параметр своих методов проверяете таким же образом и кидаете исключение с понятным сообщением, то вам остаток этой статьи не потребуется. Обращение по null- ссылке может произойти в следующих случаях: Вызов нестатического метода класса. Обращение (чтение или запись) к нестатическому полю. Обращение (чтение или запись) к элементу массива.
Чтение length у массива. Неявный вызов метода value. Of при анбоксинге (unboxing). Важно понимать, что эти случаи должны произойти именно в той строчке, на которой заканчивается stack trace, а не где- либо ещё. Рассмотрим такой код: 1: class Data ? Нетрудно заметить, что f в этой строке вообще не читается, так как метод format статический.
Конечно, обращаться к статическому методу через экземпляр класса плохо, но такой код встречается (мог, например, появиться после рефакторинга). Так или иначе значение f не может быть причиной исключения. Если бы d был не null, а d. Аналогично проблема не могла быть внутри метода get. Value, даже если бы он был сложнее.
Раз исключение в пятнадцатой строчке, остаётся одна возможная причина: null в параметре d. Вот другой пример: 1: class Formatter . Зато s не может быть ни под каким соусом: в девятой строке уже было обращение к s. Если бы s было null, исключение бы случилось в девятой строке. Просмотр логики кода перед исключением довольно часто помогает отбросить некоторые варианты. С логикой, конечно, надо быть внимательным.
Предположим, условие в девятой строчке было бы написано так: if(. Анализируя вышестоящий код, уточняйте в документации или исходниках, как используемые методы и конструкции реагируют на null.
Оператор конкатенации строк +, к примеру, никогда не вызывает NPE. Вот такой код (здесь может играть роль версия Java, я использую Oracle JDK 1. Print. Writer. 3: public class Test. NPE . Возможно, null в obj?
Легко проверить, что pw. Пойдём с конца. Исключение случилось здесь: 4. String s) . Значит, s содержит null. Как так могло получиться? Поднимемся по стеку выше: 6.
Object obj) . В каком случае он может вернуть null? String value. Of(Object obj) ?
Значит, ошибку надо искать в переопределённом методе to. String() нашего объекта My. Object. Заметьте, в stack trace My. Object вообще не фигурировал, но проблема именно там.
Такой несложный анализ может сэкономить кучу времени на попытки воспроизвести ситуацию в отладчике. Сильные Стороны Личности тут. Не стоит забывать и про коварный автобоксинг.
Пусть у нас такой код: 1: public class Test. NPE . Но следует взглянуть на класс My. Container: import java. List. public class My.
Container ? Обнаружив класс, подобный классу My. Container, посмотрите в истории системы контроля версий, кто его автор, и насыпьте ему крошек под одеяло. Помните, что если метод принимает параметр int, а вы передаёте Integer null, то анбоксинг случится до вызова метода, поэтому NPE будет указывать на строку с вызовом.
В заключение хочется пожелать пореже запускать отладчик: после некоторой тренировки анализ кода в голове нередко выполняется быстрее, чем воспроизведение трудноуловимой ситуации.