Как проверить строку против нуля в Java? - PullRequest
84 голосов
/ 27 мая 2010

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

stringname.equalsignorecase(null)

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

Ответы [ 17 ]

153 голосов
/ 27 мая 2010

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 был нулевым, он не оценивает вторую половину условного, и все в порядке.

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

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

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

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

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

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

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

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

28 голосов
/ 27 мая 2010
s == null

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

17 голосов
/ 27 мая 2010

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

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

;)

9 голосов
/ 13 ноября 2014

Использовать метод TextUtils.

TextUtils.isEmpty (str) : Возвращает true, если строка имеет нулевое значение или длину 0. Параметры: str строка для проверки Возвращает: истина, если 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 голосов
/ 27 мая 2010

Если мы посмотрим на реализацию метода equalsIgnoreCase, мы найдем эту часть:

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

Таким образом, он всегда вернет false, если аргумент равен null. И это, очевидно, правильно, потому что единственный случай, когда он должен возвращать true, это когда equalsIgnoreCase был вызван на null String, но

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

обязательно приведет к исключению NullPointerException.

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

4 голосов
/ 03 декабря 2012

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

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

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

3 голосов
/ 27 мая 2010

Я не уверен, что не так с ответом 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 голосов
/ 19 августа 2016

Вы можете проверить с помощью String == null

Это работает для меня

    String foo = null;
    if(foo == null){
        System.out.println("String is null");
    }
2 голосов
/ 18 марта 2016

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

import org.apache.commons.lang.StringUtils;

затем используйте его, они оба вернут true

System.out.println(StringUtils.isEmpty(""));
System.out.println(StringUtils.isEmpty(null)); 
2 голосов
/ 18 февраля 2013

Если ваша строка имеет нулевое значение, вы можете использовать

if(null == stringName){

  [code]

}

else

[Error Msg]
...