Как проверить строку на нулевое значение в Java?

93

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

stringname.equalsignorecase(null)

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

user351809
источник

Ответы:

164

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


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

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

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

Причина в том, что foo имеет значение null, поэтому он не знает, что такое .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 имеет значение null, он не оценивает вторую половину условного выражения, и все в порядке.

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

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
вы пропустили версию Йоды, тоже работает каждый раз: if ("foo" .equalsIgnoreCase (string))
Омри Ядан
2
Хорошее полезное объяснение. Спасибо за хорошую игру.
james.garriss
@aioobe Думаю, мы согласны? Если можно будет более понятно, рад редактировать.
Дин Дж
31
s == null

не сработает?

мику
источник
4
@ k38: Вы должны использовать "только", equals()если хотите сравнить значения . Но если вы хотите проверить, есть ли переменная null, вы используете ==.
Феликс Клинг,
17

Конечно, работает. Вы упускаете важную часть кода. Вам просто нужно сделать вот так:

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

;)

aioobe
источник
24
Если вы дочитали до этого места, пожалуйста, поймите, что @aioobe шутит; тебе не следует так поступать.
Dean J
12

Используйте метод TextUtils, если вы работаете в Android.

TextUtils.isEmpty (str) : возвращает значение true, если строка имеет значение NULL или нулевую длину. Параметры: str проверяемая строка. Возвращает: true, если str имеет нулевую или нулевую длину.

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

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

 /**
     * 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.

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

Андреас Долк
источник
4

Это выглядит немного странно, но ...

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

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

Тимоти Перес
источник
остерегайтесь NullPointer, в этом случае второе условие должно быть первым.
Pawan
3

Я не уверен, что было не так с ответом MYYN.

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

Вышеупомянутая нулевая проверка вполне приемлема.

Если вы пытаетесь проверить, совпадает ли ссылка String (без учета регистра) с другой строкой, которая, как вы знаете , не является пустой ссылкой, сделайте что-то вроде этого:

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]
Пользователь_86
источник
3
почему null == stringName, а не stringName == null? Я предполагаю, что нет никакой разницы, но почему это предпочтительнее (и я видел это много). Я предпочитаю порядок чтения LTR, поэтому stringName == null, но хочу знать, что думают другие люди.
Лукаш 'Severiaan' Грела
7
обычно при сравнении вы помещаете переменную справа, чтобы вы не инициализировали переменную по ошибке: null = stringName вызывает ошибку компиляции, в то время как stringName = null возможна
Сараджог
4
Это вообще не «нормально», и многие люди категорически запрещают это, так как это нечитаемо для тех, кто читает базу кода.
RichieHH 05
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, который соответствует двум возможным условиям: -

  1. stringnameимеет какое-то ненулевое строковое значение (скажем, "компьютер"):
    ваш код будет работать нормально, поскольку он принимает форму,
    "computer".equalsignorecase(null)
    и вы получите ожидаемый ответ как false.
  2. stringnameимеет nullзначение:
    здесь ваш код застрянет, поскольку
    null.equalsignorecase(null)
    на первый взгляд кажется хорошим, и вы можете надеяться, что ответ true,
    но nullэто не объект, который может выполнить equalsignorecase()метод.

Следовательно, вы получаете исключение из-за случая 2.
Я предлагаю вам просто использоватьstringname == null

Satyendra
источник
1

Простой способ:

public static boolean isBlank(String value) {
    return (value == null || value.equals("") || value.equals("null") || value.trim().equals(""));
}
Альберто Черкейра
источник
1

Если valueвозвращено значение null, используйте:

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();

В этом примере для строки вызывается обрезка, которая выдаст NPE, если строка была нулем или пробелами, но в той же строке вы можете проверить на null или пробел, чтобы не получить тонну (больше ) трудно форматировать блоки if.

Риз
источник
Что вы имеете в виду, проверяя наличие пустого или нулевого значения? Здесь вы проверяете только null. Бланк - это один из возможных вариантов возврата "COND? A: B;" построить, да?
philo vivero
0

Если я правильно понимаю, это должно сработать:

if(!stringname.isEmpty())
// an if to check if stringname is not null
if(stringname.isEmpty())
// 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