Как проверить, равна ли моя строка нулю?


172

Я хочу выполнить какое-то действие ТОЛЬКО ЕСЛИ моя строка имеет значимое значение. Итак, я попробовал это.

if (!myString.equals("")) {
doSomething
}

и это

if (!myString.equals(null)) {
doSomething
}

и это

if ( (!myString.equals("")) && (!myString.equals(null))) {
doSomething
}

и это

if ( (!myString.equals("")) && (myString!=null)) {
doSomething
}

и это

if ( myString.length()>0) {
doSomething
}

И во всех случаях моя программа, doSomethingнесмотря на то, что моя строка пуста. Это равно null. Итак, что не так с этим?

ДОБАВЛЕНО:

Я нашел причину проблемы. Переменная была объявлена ​​как строка и, как следствие, nullприсвоена этой переменной была преобразована в "null"! Итак, if (!myString.equals("null"))работает.


2
nullнет никаких методов, так что нет equals(). Если бы вы myStringбыли null, как бы вы вызвали метод для этого? :)
BalusC

1
Могу ли я предложить вам System.out.println(myString)непосредственно перед блоком if, чтобы вы могли увидеть, что там?
Майкл Майерс

1
Откуда ты знаешь, что "это равно null"?
Ричард Дж.П. Ле Гуэн,

6
nullприсвоение этой переменной было преобразовано в "null"- это ужасная идея. Попробуйте изменить этот дизайн, если это вообще возможно.
полигенасмазочные материалы

8
Тьфу - не думаю, что проверка того, является ли (! MyString.equals ("null")) лучшим решением. Я подозреваю, что большинство будет считать, что точка, в которой строка «null» была присвоена myString, является ошибкой.
Берт F

Ответы:


231
if (myString != null && !myString.isEmpty()) {
  // doSomething
}

В качестве дальнейшего комментария, вы должны знать этот термин в equalsдоговоре:

От Object.equals(Object):

Для любого ненулевого ссылочного значения x, x.equals(null)следует return false.

Способ для сравнения с nullиспользованием x == nullи x != null.

Более того x.fieldи x.method()кидает NullPointerExceptionесли x == null.


2
Вы должны сделать проверку длины, а не равных в целях эффективности. Проверьте эту ссылку hanuska.blogspot.com/2006/08/empty-string.html
CoolBeans

7
Я бы сказал, что вы должны сделать s.isEmpty()вместо s.length() == 0читабельности. Любая разница в производительности незначительна. Я согласен, что s.equals("")это ужасно.
полигенасмазочные материалы

6
Я согласен с удобочитаемостью. Это зависит от того, используем ли мы Java 5 против Java 6, поскольку isEmpty () только в Java 6.
CoolBeans

@CoolBeans: Хороший комментарий! Я не понял этого! Я немного опаздываю на вечеринку Java =)
полигеномасла

26

Если myStringесть null, то вызов myString.equals(null)или myString.equals("")не удастся с NullPointerException. Вы не можете вызывать какие-либо методы экземпляра для пустой переменной.

Сначала проверьте на null вот так:

if (myString != null && !myString.equals("")) {
    //do something
}

Это использует оценку короткого замыкания, чтобы не пытаться выполнить проверку .equalsif myStringnull.


+1 за короткое замыкание; важно, чтобы выражение работало. Тем не менее, вы действительно должны использовать .isEmpty()вместо .equals("").
полигенасмазочные материалы

1
Хорошо, я хотел оставить свой комментарий к этому сообщению. ржунимагу. -> «Вы должны делать проверку длины, а не равных в целях эффективности. Проверьте эту ссылку hanuska.blogspot.com/2006/08/empty-string.html»
CoolBeans

@CoolBeans: Конечно, и с Java 6 вы могли бы даже сделать myString.isEmpty(). Но на этом уровне удобочитаемость важнее оптимизации, и люди могут более привыкнуть к чтению myString.equals(""). (Или, возможно, нет.)
Майкл Майерс


13

Если myString на самом деле имеет значение null, то любой вызов ссылки завершится с исключением Null Pointer Exception (NPE). Начиная с Java 6, используйте #isEmpty вместо проверки длины (в любом случае НИКОГДА не создавайте новую пустую строку с проверкой).

if (myString != null &&  !myString.isEmpty()){
    doSomething();
}

Между прочим, если сравнивать со строковыми литералами, как вы это сделаете, произойдет обратное утверждение, чтобы не иметь нулевой проверки, т. Е.

if ("some string to check".equals(myString)){
  doSomething();
} 

вместо того :

if (myString != null &&  myString.equals("some string to check")){
    doSomething();
}

1
Хороший вопрос, но последние два if не эквивалентны. При myString = "abc" средний не вызывает doSomething, а третий вызывает.
Римский

@ rimsky это исправлено
pavi2410


6

Вы должны проверить, что myStringобъект null:

if (myString != null) {
    doSomething
}

5

Если ваша строка пуста, вызовы, подобные этому, должны генерировать исключение NullReferenceException:

myString.equals (нуль)

Но в любом случае, я думаю, что такой метод, как вы хотите:

public static class StringUtils
{
    public static bool isNullOrEmpty(String myString)
    {
         return myString == null || "".equals(myString);
    }
}

Затем в своем коде вы можете делать такие вещи:

if (!StringUtils.isNullOrEmpty(myString))
{
    doSomething();
}

5

Я бы рекомендовал использовать существующую утилиту или создать свой собственный метод:

public static boolean isEmpty(String string) {
    return string == null || string.length() == 0;
}

Тогда просто используйте его, когда вам это нужно:

if (! StringUtils.isEmpty(string)) {
  // do something
}

Как отмечено выше, || и && операторы короткого замыкания. Это означает, что как только они могут определить свою ценность, они останавливаются. Поэтому, если (string == null) имеет значение true, часть длины не нужно оценивать, поскольку выражение всегда будет истинным. Аналогично с &&, где, если левая сторона ложна, выражение всегда ложно и не нуждается в дальнейшей оценке.

Как дополнительное примечание, использование длины обычно лучше, чем использование .equals. Производительность немного лучше (не очень) и не требует создания объектов (хотя большинство компиляторов могут оптимизировать это).


4

Пытаться,

myString!=null && myString.length()>0

это невозможно, если myString имеет значение null
hsmit

4
это в значительной степени возможно, когда myString имеет значение null. Вы должны знать, что когда левая часть && не сработает, правое выражение вообще не будет оцениваться ..
bragboy


4

Каждый раз, когда мне приходится иметь дело со строками (почти каждый раз), я останавливаюсь и задаюсь вопросом, какой способ действительно является самым быстрым способом проверить наличие пустой строки. Конечно, проверка string.Length == 0 должна быть самой быстрой, поскольку Length является свойством, и не должно быть никакой обработки, кроме получения значения свойства. Но потом я спрашиваю себя, почему там String.Empty? Я должен сказать, что проверка на String.Empty должна быть быстрее, чем на длину. Ну, я решил проверить это. Я написал небольшое приложение для консоли Windows, которое сообщает мне, сколько времени потребуется, чтобы выполнить определенную проверку на 10 миллионов повторений. Я проверил 3 разных строки: пустую строку, пустую строку и строку "". Я использовал 5 разных методов: String.IsNullOrEmpty (), str == null, str == null || str == String.Empty, str == null || str == "", str == null || ул.

String.IsNullOrEmpty()
NULL = 62 milliseconds
Empty = 46 milliseconds
"" = 46 milliseconds

str == null
NULL = 31 milliseconds
Empty = 46 milliseconds
"" = 31 milliseconds

str == null || str == String.Empty
NULL = 46 milliseconds
Empty = 62 milliseconds
"" = 359 milliseconds

str == null || str == ""
NULL = 46 milliseconds
Empty = 343 milliseconds
"" = 78 milliseconds

str == null || str.length == 0
NULL = 31 milliseconds
Empty = 63 milliseconds
"" = 62 milliseconds

Согласно этим результатам, проверка в среднем str == nullявляется самой быстрой, но не всегда дает то, что мы ищем. if str = String.Emptyили str = ""это приводит к ложному. Тогда у вас есть 2, которые связаны на втором месте: String.IsNullOrEmpty()и str == null || str.length == 0. Так как String.IsNullOrEmpty()выглядит лучше и легче (и быстрее) писать, я бы рекомендовал использовать его поверх другого решения.


3

Я бы сделал что-то вроде этого:

( myString != null && myString.length() > 0 )
    ? doSomething() : System.out.println("Non valid String");
  • Проверка на нулевое значение проверяет, содержит ли myString экземпляр String.
  • length () возвращает длину и эквивалентно равно ("").
  • Проверка, является ли myString нулевой первой, позволит избежать исключения NullPointerException.

3

Я использую StringUtil.isBlank(string)

Он проверяет, является ли строка пустой: null, emtpy или только пробел.

Так что этот пока лучший

Вот оригинальный метод из документов

/**
    * Tests if a string is blank: null, emtpy, or only whitespace (" ", \r\n, \t, etc)
    * @param string string to test
    * @return if string is blank
    */
    public static boolean isBlank(String string) {
        if (string == null || string.length() == 0)
            return true;

        int l = string.length();
        for (int i = 0; i < l; i++) {
            if (!StringUtil.isWhitespace(string.codePointAt(i)))
                return false;
        }
        return true;
    } 

2

Это должно работать:

if (myString != null && !myString.equals(""))
    doSomething
}

Если нет, то, вероятно, myString имеет значение, которое вы не ожидаете. Попробуйте напечатать это так:

System.out.println("+" + myString + "+");

Использование символов «+» для окружения строки покажет вам, есть ли там лишние пробелы, которые вы не учитываете.


2

if(str.isEmpty() || str==null){ do whatever you want }


3
isEmpty перевернуто .. если вы вызываете метод для нулевого объекта, вы получаете NPE
Brian

Если строка равна нулю, вы получите исключение нулевого указателя, даже до того, как вы проверите, что это пустое значение. Этот код никогда не должен использоваться!
gil.fernandes

2

Хорошо, вот как типы данных работают в Java. (Вы должны извинить мой английский, я, вероятно, не использую правильный словарь. Вы должны различать два из них. Базовые типы данных и обычные типы данных. Базовые типы данных в значительной степени составляют все, что существует. Например, есть все числа, символы, логические значения и т. д. Обычные типы данных или сложные типы данных - это все остальное. Строка - это массив символов, поэтому сложный тип данных.

Каждая переменная, которую вы создаете, на самом деле является указателем на значение в вашей памяти. Например:

String s = new String("This is just a test");

переменная "s" НЕ содержит строку. Это указатель. Этот указатель указывает на переменную в вашей памяти. При вызове System.out.println(anyObject), то toString()метод этого объекта называется. Если он не переопределил toStringобъект, он напечатает указатель. Например:

public class Foo{
    public static void main(String[] args) {
        Foo f = new Foo();
        System.out.println(f);
    }
}

>>>>
>>>>
>>>>Foo@330bedb4

Все, что стоит за «@» - это указатель. Это работает только для сложных типов данных. Примитивные типы данных ПРЯМО сохраняются в своем указателе. Так что на самом деле указатель отсутствует, а значения сохраняются напрямую.

Например:

int i = 123;

Я не храню указатель в этом случае. я буду хранить целочисленное значение 123 (в байтах ofc).

Итак, давайте вернемся к ==оператору. Он всегда сравнивает указатель, а не содержимое, сохраненное в позиции указателя в памяти.

Пример:

String s1 = new String("Hallo");
String s2 = new String("Hallo");

System.out.println(s1 == s2);

>>>>> false

Эта строка имеет разные указатели. String.equals (String other) однако сравнивает содержимое. Вы можете сравнивать примитивные типы данных с оператором '==', поскольку указатель двух разных объектов с одинаковым содержимым одинаков.

Ноль будет означать, что указатель пуст. Пустой примитивный тип данных по умолчанию равен 0 (для чисел). Null для любого сложного объекта, однако, означает, что этот объект не существует.

Приветствую


2

Для меня лучшая проверка, если строка имеет какое-либо значимое содержимое в Java, это:

string != null && !string.trim().isEmpty()

Прежде всего , проверьте , является ли строка , nullчтобы избежать , NullPointerExceptionи тогда вы зачистите все символы пробела , чтобы избежать проверок строк , которые имеют только пробельные и , наконец , проверить , если обрезанная строка не пуста, то есть имеет длину 0.


1

У меня была эта проблема в Android, и я использую этот способ (работа для меня):

String test = null;
if(test == "null"){
// Do work
}

Но в коде Java я использую:

String test = null;
if(test == null){
// Do work
}

И :

private Integer compareDateStrings(BeanToDoTask arg0, BeanToDoTask arg1, String strProperty) {
    String strDate0 = BeanUtils.getProperty(arg0, strProperty);_logger.debug("strDate0 = " + strDate0);
    String strDate1 = BeanUtils.getProperty(arg1, strProperty);_logger.debug("strDate1 = " + strDate1);
    return compareDateStrings(strDate0, strDate1);
}

private Integer compareDateStrings(String strDate0, String strDate1) {
    int cmp = 0;
    if (isEmpty(strDate0)) {
        if (isNotEmpty(strDate1)) {
            cmp = -1;
        } else {
            cmp = 0;
        }
    } else if (isEmpty(strDate1)) {
        cmp = 1;
    } else {
        cmp = strDate0.compareTo(strDate1);
    }
    return cmp;
}

private boolean isEmpty(String str) {
    return str == null || str.isEmpty();
}
private boolean isNotEmpty(String str) {
    return !isEmpty(str);
}


1

В Android вы можете проверить это с помощью метода полезности isEmptyот TextUtils,

public static boolean isEmpty(CharSequence str) {
    return str == null || str.length() == 0;
}

isEmpty(CharSequence str)Метод проверки как состояния, так nullи длины.


1

Я всегда использую так:

if (mystr != null && !mystr.isEmpty()){
  //DO WHATEVER YOU WANT OR LEAVE IT EMPTY
}else {
  //DO WHATEVER YOU WANT OR LEAVE IT EMPTY
}

или вы можете скопировать это в ваш проект:

private boolean isEmptyOrNull(String mystr){
    if (mystr != null && !mystr.isEmpty()){ return true; }
    else { return false; }
}

и просто назовите это как:

boolean b = isEmptyOrNull(yourString);

он вернет истину, если он пуст или равен нулю.
b=trueесли пусто или ноль

или вы можете использовать try catch и catch, когда оно пустое.


0

Я думаю, что myString - это не строка, а массив строк. Вот что вам нужно сделать:

String myNewString = join(myString, "")
if (!myNewString.equals(""))
{
    //Do something
}

Мой код для обработки. Обработка - это язык программирования на основе Java. Более подробная информация о join: processing.org/reference/join_.html .
Mimit

0

Вы можете проверить строку, равную нулю, используя это:

String Test = null;
(Test+"").compareTo("null")

Если результат равен 0, то (Test + "") = "null".


это просто создает ненужную строку
svarog

0

Я попробовал большинство примеров, приведенных выше, для нулевого значения в приложении для Android, которое я собирал, и ЭТО ВСЕ ОШИБЛО. Поэтому я нашел решение, которое работало в любое время для меня.

String test = null+"";
If(!test.equals("null"){
       //go ahead string is not null

}

Так что просто конкатенируйте пустую строку, как я делал выше, и протестируйте на «null», и она отлично работает. На самом деле не исключение не выбрасывается


1
Нет, это абсолютно ужасное решение. Ответы выше работают.
Конрад Рудольф

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

Я могу с уверенностью сказать, что это означает, что с вашим кодом что - то не так, и вы просто исправляете симптомы, а не источник ошибки. Не поймите это неправильно, но это типичный случай программирования культа грузов .
Конрад Рудольф


0

Если вы работаете в Android, вы можете использовать простой класс TextUtils. Проверьте следующий код:

if(!TextUtils.isEmpty(myString)){
 //do something
}

Это простое использование кода. Ответ может быть повторен. Но просто иметь один и тот же чек для вас.


-5

Вы должны проверить с нуля if(str != null).


5
Ваше решение было опубликовано другими пользователями много лет назад ... Какой смысл повторять это?
TDG

1
я вижу, что ни один из ответов не подтвержден, поэтому я отвечаю ему
rawa rawandze

6
Да, он не подтвердил ответы с 2010 года, поэтому вы просто повторите предыдущий ответ, и он подтвердит ваш ответ ...
TDG
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.