Як перевірити рядок проти null у Java?


92

Як я можу перевірити рядок проти нуля в Java? я використовую

stringname.equalsignorecase(null)

але це не працює.

Відповіді:


163

string == nullпорівнює, якщо об'єкт нульовий. string.equals("foo")порівнює значення всередині цього об'єкта. string == "foo"не завжди працює, оскільки ви намагаєтеся зрозуміти, чи однакові об’єкти, а не значення, які вони представляють.


Довша відповідь:

Якщо ви спробуєте це, це не спрацює, як ви виявили:

String foo = null;
if (foo.equals(null)) {
    // That fails every time. 
}

Причина полягає в тому, що foo є нульовим, тому він не знає, що таке .equals; там немає об’єкта, з якого можна викликати .equals.

Те, що ви, напевно, хотіли:

String foo = null;
if (foo == null) {
    // That will work.
}

Типовий спосіб захиститися від нуля при роботі зі рядками:

String foo = null;
String bar = "Some string";
...
if (foo != null && foo.equals(bar)) {
    // Do something here.
}

Таким чином, якщо foo був нульовим, він не оцінює другу половину умовного, і все в порядку.

Найпростіший спосіб, якщо ви використовуєте літерал String (замість змінної):

String foo = null;
...
if ("some String".equals(foo)) {
    // Do something here.
}

Якщо ви хочете обійти це, Apache Commons має клас - StringUtils - який забезпечує нульові безпечні операції з рядками .

if (StringUtils.equals(foo, bar)) {
    // Do something here.
}

Ще одна відповідь жартувала і сказала, що ви повинні зробити це:

boolean isNull = false;
try {
    stringname.equalsIgnoreCase(null);
} catch (NullPointerException npe) {
    isNull = true;
}

Будь ласка, не роби цього. Ви повинні подавати виключення лише для виняткових помилок; якщо ви очікуєте нуль, вам слід перевірити його заздалегідь, і не дозволяти йому видавати виняток.

У моїй голові є дві причини цього. По-перше, винятки повільні; перевірка проти null є швидкою, але коли JVM видає виняток, це займає багато часу. По-друге, код набагато легше читати та підтримувати, якщо ви просто заздалегідь перевіряєте наявність нульового покажчика.


2
ви пропустили версію Yoda, також працює кожен раз: if ("foo" .equalsIgnoreCase (рядок))
Омрі Ядан

2
Приємне корисне пояснення. Дякую, що грали приємно.
james.garriss

@aioobe Я думаю, що ми згодні? Якщо ви можете бути більш чіткими, раді редагувати.
Dean J

31
s == null

не буде працювати?


4
@ k38: Вам потрібно лише "використовувати", equals()якщо ви хочете порівняти значення . Але якщо ви хочете перевірити, чи є змінною null, ви використовуєте ==.
Фелікс Клінг,

18

Звичайно, це працює. Ви втрачаєте важливу частину коду. Вам просто потрібно зробити так:

boolean isNull = false;
try {
    stringname.equalsIgnoreCase(null);
} catch (NullPointerException npe) {
    isNull = true;
}

;)


23
Якщо ви читали так далеко, будь ласка, зрозумійте, що @aioobe жартує; ви не повинні робити це таким чином.
Дін Дж

12

Використовуйте метод TextUtils, якщо ви працюєте в Android.

TextUtils.isEmpty (str) : Повертає true, якщо рядок є нульовим або довжиною 0. Параметри: str рядок для перевірки Повертає: true, якщо str має нульову або нульову довжину

  if(TextUtils.isEmpty(str)) {
        // str is null or lenght is 0
    }

Нижче наведено вихідний код цього методу. Ви можете використовувати direclty.

 /**
     * Returns true if the string is null or 0-length.
     * @param str the string to be examined
     * @return true if str is null or zero length
     */
    public static boolean isEmpty(CharSequence str) {
        if (str == null || str.length() == 0)
            return true;
        else
            return false;
    }

5

Якщо ми подивимось на реалізацію методу equalsIgnoreCase, ми знайдемо цю частину:

if (string == null || count != string.count) {
    return false;
}

Тож воно завжди повернеться, falseякщо аргумент є null. І це, очевидно, правильно, оскільки єдиний випадок, коли він повинен повернутися, true- це коли equalsIgnoreCase було викликано на a null String, але

String nullString = null;
nullString.equalsIgnoreCase(null);

безумовно призведе до NullPointerException.

Тож рівні методи не призначені для перевірки, чи є об’єкт нульовим, лише тому, що ви не можете викликати їх null.


4

Це виглядає трохи дивним, але ...

stringName == null || "".equals(stringName)

Ніколи не виникало жодних проблем із цим способом, плюс це більш безпечний спосіб перевірки, уникаючи потенційних винятків з нульовими крапками.


остерігайтеся NullPointer, у цьому випадку друга умова повинна бути першою.
Pawan

3

Я не впевнений, що було неправильно у відповіді The MYYN.

if (yourString != null) {
  //do fun stuff with yourString here
}

Вищезазначена нульова перевірка цілком вірна.

Якщо ви намагаєтеся перевірити, чи посилання на рядок дорівнює (ігноруючи регістр) іншому рядку, який, як ви знаєте , не є нульовим посиланням, зробіть щось подібне:

String x = "this is not a null reference"
if (x.equalsIgnoreCase(yourStringReferenceThatMightBeNull) ) {
  //do fun stuff
}

Якщо є сумніви щодо того, чи є у вас нульові посилання для обох рядків, які ви порівнюєте, вам потрібно буде перевірити наявність нульового посилання принаймні на один із них, щоб уникнути можливості NullPointerException.


2

Якщо ваш рядок має значення "null", тоді ви можете використовувати

if(null == stringName){

  [code]

}

else

[Error Msg]

3
чому null == stringName, а не stringName == null? Я припускаю, що різниці немає, але чому це переважно (і я це багато бачив). Я віддаю перевагу порядку читання LTR, тому stringName == null, але хочу знати, що думають інші люди.
Лукаш Северян Грела

7
зазвичай у порівнянні ви ставите змінну праворуч, щоб ви не ініціалізували змінну помилково: null = stringName видає помилку компіляції, тоді як stringName = null буде можливим
Sarajog

4
Це взагалі не "нормально", і багато людей категорично забороняють це, оскільки це, природно, не читається тим, хто читає основу коду.
RichieHH

2

імпортуйте його у свій клас

import org.apache.commons.lang.StringUtils;

тоді скористайтеся ним, вони обидва повернуть істину

System.out.println(StringUtils.isEmpty(""));
System.out.println(StringUtils.isEmpty(null)); 

2

Ви можете перевірити String == null

Це працює для мене

    String foo = null;
    if(foo == null){
        System.out.println("String is null");
    }

1

Звичайно user351809, stringname.equalsignorecase(null)викине NullPointerException.
Дивіться, у вас є об’єкт рядка stringname, який виконує 2 можливі умови: -

  1. stringnameмає якесь ненульове значення рядка (скажімо "комп'ютер"):
    Ваш код буде працювати нормально, оскільки він приймає форму,
    "computer".equalsignorecase(null)
    і ви отримуєте очікувану відповідь як false.
  2. stringnameмає nullзначення:
    Тут ваш код застрягне, оскільки
    null.equalsignorecase(null)
    Однак на перший погляд здається хорошим, і ви можете сподіватися на відповідь як true,
    але nullне є об’єктом, який може виконати equalsignorecase()метод.

Отже, ви отримуєте виняток через випадок 2.
Те, що я пропоную вам, це просто використовуватиstringname == null



1

Якщо valueповернене значення є нульовим, використовуйте:

if(value.isEmpty());

Іноді для перевірки null if(value == null)в Java це може не дати true, навіть якщо String є null.


1
Використання Scala (з Java) if(value.isEmpty())дає NullPointerException. У цьому випадку краще використовуватиif(value == null)
Андреа

Це, безумовно, неправильно, оскільки воно завжди викине NPE, якщо значення нульове.
Роджер

1

З Java 7 ви можете використовувати

if (Objects.equals(foo, null)) {
    ...
}

який повернеться, trueякщо обидва параметри null.


0

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

String someString = someObject.getProperty() == null ? "" : someObject.getProperty().trim();

У цьому прикладі на рядок викликається trim, який видасть NPE, якщо рядок нульовий або пробіли, але в цьому ж рядку ви можете перевірити нульовий або порожній, щоб у вас не вийшло тонни (більше ) важко форматувати, якщо блоки.


Що ви маєте на увазі перевірка на нуль чи порожній? Ви тут перевіряєте лише на нуль. Пробіл є одним із можливих повернень "COND? A: B;" побудувати, так?
philo vivero

0

Якщо я правильно розумію, це слід зробити:

if(!stringname.isEmpty())
// an if to check if stringname is not null
if(stringname.isEmpy())
// an if to check if stringname is null

-2

Ну, востаннє хтось задавав це безглузде питання, відповідь була:

someString.equals("null")

Однак це "виправлення" лише приховує більшу проблему того, як це nullстає "null"насамперед.


Це ні - отже, це не виправлення і не корисна відповідь.
Chris Stratton

Я хотів би бути першим, хто сказав: "ват"
philo vivero

це не відповідає на запитання
Джейсон Адамс,

-2

Є два способи зробити це ... Скажіть String == null або string.equals () ..

public class IfElse {

    public int ifElseTesting(String a){
        //return null;
        return (a== null)? 0: a.length();
    }

}

public class ShortCutifElseTesting {

    public static void main(String[] args) {

        Scanner scanner=new Scanner(System.in);
        System.out.println("enter the string please:");
        String a=scanner.nextLine();
        /*
        if (a.equals(null)){
            System.out.println("you are not correct");
        }
        else if(a.equals("bangladesh")){
            System.out.println("you are right");
        }
        else
            System.out.println("succesful tested");

        */
        IfElse ie=new IfElse();
        int result=ie.ifElseTesting(a);
        System.out.println(result);

    }

}

Перевірте цей приклад .. Ось ще один приклад ярликової версії If Else ..


1
Немає! .equals () не можна використовувати з потенційно нульовим об'єктом, тому вступне пояснення помилково. А решта цієї відповіді здається безглуздою і не пов’язаною із поставленим запитанням.
Chris Stratton
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.