Как я могу проверить строку по пустому указателю в Java? Я использую
stringname.equalsignorecase(null)
но это не работает.
Если мы посмотрим на реализацию метода equalsIgnoreCase, мы найдем эту часть:
if (string == null || count != string.count) {
return false;
}
Таким образом, он всегда будет возвращать false
, если аргумент равен null
. И это, очевидно, правильно, потому что единственный случай, когда он должен вернуть true
, - это когда equalsIgnoreCase был вызван для нулевой строки
, но
String nullString = null;
nullString.equalsIgnoreCase(null);
определенно приведет к исключению NullPointerException.
Таким образом, методы equals не предназначены для проверки того, является ли объект нулевым только потому, что вы не можете вызвать их на null
.
Ну, в последний раз, когда кто-то задавал этот глупый вопрос, ответ был:
someString.equals("null")
Это «исправление» только скрывает большую проблему: как null
становится «null»
в но первое место.
Конечно, работает. Вы упускаете важную часть кода. Вам просто нужно сделать вот так:
boolean isNull = false;
try {
stringname.equalsIgnoreCase(null);
} catch (NullPointerException npe) {
isNull = true;
}
;)
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 выдает исключение, это занимает много времени. Во-вторых, код будет намного проще читать и поддерживать, если вы просто заранее проверяете наличие нулевого указателя.
Я не уверен, что не так с ответом 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.