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

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

stringname.equalsignorecase(null)

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

86
задан elitalon 29 November 2011 в 19:02
поделиться

6 ответов

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

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

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

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

определенно приведет к исключению NullPointerException.

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

5
ответ дан 24 November 2019 в 07:58
поделиться
s == null

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

29
ответ дан 24 November 2019 в 07:58
поделиться

Ну, в последний раз, когда кто-то задавал этот глупый вопрос, ответ был:

someString.equals("null")

Это «исправление» только скрывает большую проблему: как null становится «null» в но первое место.

-2
ответ дан 24 November 2019 в 07:58
поделиться

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

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

;)

17
ответ дан 24 November 2019 в 07:58
поделиться

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.
}

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

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 выдает исключение, это занимает много времени. Во-вторых, код будет намного проще читать и поддерживать, если вы просто заранее проверяете наличие нулевого указателя.

155
ответ дан 24 November 2019 в 07:58
поделиться

Я не уверен, что не так с ответом 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.

3
ответ дан 24 November 2019 в 07:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: