Проверка строки на null java

    Статьи, 3 июня 2015 в 17:50

Java и null неразрывно связаны. Трудно найти Java-программиста, который не сталкивался с NullPointerException . Если даже автор понятия нулевого указателя признал его «ошибкой на миллиард долларов», почему он сохранился в Java? null присутствует в Java уже давно, и я уверен, что разработчики языка знают, что он создает больше проблем, чем решает. Это удивительно, ведь философия Java — делать вещи как можно более простыми. Если разработчики отказались от указателей, перегрузки операторов и множественного наследования, то почему они оставили null ? Я не знаю ответа на этот вопрос. Однако не имеет значения, насколько много критики идет в адрес null в Java, нам придется с этим смириться. Вместо того, чтобы жаловаться, давайте лучше научимся правильно его использовать. Если быть недостаточно внимательным при использовании null , Java заставит вас страдать с помощью ужасного java.lang.NullPointerException . Наиболее частая причина NullPointerException — недостаточное понимание тонкостей использования null . Давайте вспомним самые важные вещи о нем в Java.

Что такое null в Java

Как мы уже выяснили, null очень важен в Java. Изначально он служил, чтобы обозначить отсутствие чего-либо, например, пользователя, ресурса и т. п. Но уже через год выяснилось, что он приносит много проблем. В этой статье мы рассмотрим основные вещи, которые следует знать о нулевом указателе в Java, чтобы свести к минимуму проверки на null и избежать неприятных NullPointerException .

1. В первую очередь, null — это ключевое слово в Java, как public , static или final . Оно регистрозависимо, поэтому вы не сможете написать Null или NULL , компилятор этого не поймет и выдаст ошибку:

Эта проблема часто возникает у программистов, которые переходят на Java с других языков, но с современными средами разработки это несущественно. Такие IDE, как Eclipse или Netbeans, исправляют эти ошибки, пока вы набираете код. Но во времена Блокнота, Vim или Emacs это было серьезной проблемой, которая отнимала много времени.

2. Так же, как и любой примитивный тип имеет значение по умолчанию (0 у int , false у boolean ), null — значение по умолчанию любого ссылочного типа, а значит, и для любого объекта. Если вы объявляете булеву переменную, ей присваивается значение false . Если вы объявляете ссылочную переменную, ей присваивается значение null , вне зависимости от области видимости и модификаторов доступа. Единственное, компилятор предупредит о попытке использовать неинициализированную локальную переменную. Для того, чтобы убедиться в этом, вы можете создать ссылочную переменную, не инициализируя ее, и вывести ее на экран:

Читайте также  Предохранитель на заряд аккумулятора

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

TextBack, Санкт-Петербург, от 120 000 до 200 000 ₽

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

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

4. null может быть присвоен только переменной ссылочного типа. Примитивным типам — int , double , float или boolean — значение null присвоить нельзя. Компилятор не допустит этого и выдаст ошибку:

Итак, попытка присвоения значения null примитивному типу — ошибка времени компиляции, но вы можете присвоить null типу-обертке, а затем присвоить это значение соответствуему примитиву. Компилятор ругаться не будет, но при выполнении кода будет брошено NullPointerException . Это происходит из-за автоматического заворачивания (autoboxing) в Java

5. Любой объект класса-обертки со значением null кинет NullPointerException при разворачивании (unboxing). Некоторые программисты думают, что обертка автоматически присвоит примитиву значение по умолчанию (0 для int , false для boolean и т. д.), но это не так:

Если вы запустите этот код, вы увидите Exception in thread "main" java.lang.NullPointerException в консоли. Это часто случается при работе с HashMap с ключами типа Integer . Код ниже сломается, как только вы его запустите:

Этот код выглядит простым и понятным. Мы ищем, сколько каждое число встречается в массиве, это классический способ поиска дубликатов в массиве в Java. Мы берем предыдущее значение количества, инкрементируем его и кладем обратно в HashMap . Мы полагаем, что Integer позаботится о том, чтобы вернуть значение по умолчанию для int , однако если числа нет в HashMap , метод get() вернет null , а не 0. И при оборачивании выбросит NullPoinerException . Представьте, что этот код завернут в условие и недостаточно протестирован. Как только вы его запустите на продакшен – УПС!

Читайте также  Почему не сканируется ферби бум

6. Оператор instanceof вернет false , будучи примененным к переменной со значением null или к литералу null :

Это важное свойство оператора instanceof , которое делает его полезным при приведении типов.

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

Результат выполнения этого кода:

8. Вы можете передавать null в любой метод, который принимает ссылочный тип, например, public void print(Object obj) может быть вызван так: print(null) . С точки зрения компилятора ошибки здесь нет, но поведение такого кода целиком зависит от реализации метода. Безопасный метод не кидает NullPointerException в этом случае, а тихо завершает работу. Если бизнес-логика позволяет, лучше писать безопасные методы.

9. Вы можете сравнивать null , используя оператор == («равно») и != («не равно»), но не с арифметическими или логическими операторами (такими как «больше» или «меньше»). В отличие от SQL, в Java null == null вернет true :

Вывод этого кода:

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

Как я могу проверить строку против null в java? Я использую

но он не работает.

java string null

16 ответов

135 Dean J [2010-05-27 17:21:00]

string == null сравнивается, если объект имеет значение null. string.equals("foo") сравнивает значение внутри этого объекта. string == "foo" не всегда работает, потому что вы пытаетесь определить, совпадают ли объекты, а не значения, которые они представляют.

Читайте также  Система записи врач врач

Более длинный ответ:

Если вы попробуете это, это не сработает, как вы нашли:

Причина в том, что foo имеет значение null, поэтому он не знает, что такое .equals; там нет объекта для .equals, который вызывается из.

Вероятно, вы хотели:

Типичный способ защитить себя от null при работе со строками:

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

Простым способом, если вы используете строковый литерал (вместо переменной), является:

Если вы хотите обойти это, у Apache Commons есть класс — StringUtils — который обеспечивает нулевые операции String.

Другой ответ был шуток и сказал, что вы должны это сделать:

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

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

Проверяю строку на null :

Ничего не срабатывает.

FindTabletTo делает запрос в БД.

2 ответа 2

Так как условие str == null истинно, то Вы зайдете в пустой блок и дальше перейдете к следующей строке, в которой получите NullPointerException , так как str == null .

По поводу второго фрагмента кода:

Вы создаете объект, и в receiveTablet находится ссылка на этот созданный объект. Далее Вы используете метод FindTabletTo(. ) , который возвращает какой-то объект.

Если Вам нужно проверить строку receiveTablet на отсутствие в ней содержимого или на null , то:

если FindTabletTo(. ) не возвращает null , то можно просто:

если FindTabletTo(. ) может вернуть null , то:

Ссылка на основную публикацию
Adblock
detector