Як перевірити, чи мій рядок дорівнює нулю?


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"?
Річард JP Le Guen

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. Ви не можете викликати жодні методи примірника на нульовій змінній.

Спершу перевірте наявність нуля:

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

Це використовує оцінку короткого замикання, щоб не намагатися, .equalsякщо myStringне вдасться перевірити нуль.


+1 для короткого замикання; важливо, щоб вираз працював. Однак ви дійсно повинні використовувати .isEmpty()замість цього .equals("").
полігенмастильні матеріали

1
Гаразд, я мав намір залишити свій коментар до цього поста. Лол. -> "Ви повинні зробити перевірку довжини на відміну від рівних для ефективності. Перевірте це посилання hanuska.blogspot.com/2006/08/empty-string.html"
CoolBeans

@CoolBeans: Звичайно, і з Java 6 ви навіть можете це зробити myString.isEmpty(). Але на цьому рівні оптимізація читабельності козирять, і люди можуть більше звикати читати myString.equals(""). (А можливо, ні.)
Майкл Майєрс


13

Якщо myString насправді є нульовим, то будь-який виклик посилання не вдасться з виключенням Null Pointer (NPE). Оскільки java 6, використовуйте #isEmpty замість перевірки довжини (у будь-якому випадку НІКОЛИ не створюйте нову порожню рядок із чеком).

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

Між іншим, якщо порівнювати з Stral-літералами, як і ви, буде обернено твердження, щоб не довелося мати нульову перевірку, тобто,

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

замість :

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

1
Хороший момент, але останні два ifs не рівноцінні. З myString = "abc", середній не викликає doSomething, а третій.
rimsky

@rimsky це виправлено
pavi2410


6

Вам потрібно перевірити, що myStringоб’єкт null:

if (myString != null) {
    doSomething
}

5

Якщо ваш рядок є нульовим, виклики, подібні до цього, повинні запускати NullReferenceException:

myString.equals (null)

Але в будь-якому випадку, я думаю, що такий метод вам потрібен:

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) вірно, частина довжини не потрібно оцінювати, оскільки вираз завжди був би істинним. Так само і з &&, де, якщо ліва сторона помилкова, вираз завжди помилковий і його не потрібно додатково оцінювати.

Як додаткова примітка, використання довжини, як правило, краща ідея, ніж використання .equals. Продуктивність трохи краща (не набагато) і не вимагає створення об'єктів (хоча більшість компіляторів може оптимізувати це).


4

Спробуйте,

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

це неможливо, якщо myString є нульовим
hsmit

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


4

Кожен раз, коли мені доводиться мати справу з рядками (майже кожного разу), я зупиняюся і замислююся про те, який спосіб - це справді найшвидший спосіб перевірити наявність порожнього рядка. Звичайно, check.Length == 0 перевірка повинна бути найшвидшою, оскільки Length - це властивість, і не повинно бути ніякої обробки, окрім отримання значення властивості. Але тоді я запитую себе, чому існує String.Empty? Слід сказати, що швидше слід перевірити на String.Empty, ніж на довжину. Ну, я остаточно вирішив випробувати його. Я зашифрував невеликий додаток консолі Windows, який розповідає, скільки часу потрібно зробити певну перевірку на 10 мільйонів повторів. Я перевірив 3 різні рядки: рядок NULL, порожній рядок та рядок "". Я використав 5 різних методів: String.IsNullOrEmpty (), str == null, str == null || str == String.Estpty, 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");
  • Тестування на null перевіряє, чи містить 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
Брайан

Якщо рядок є нульовим, ви отримуєте виняток "null pointer", навіть перш ніж перевірити це null. Цей код ніколи не слід використовувати!
gil.fernandes

2

Гаразд, так працюють типи даних на Java. (Ви маєте вибачення з моєї англійської, я намагаюся не використовувати правильний vocab. Ви повинні розмежовувати два з них. Базові типи даних і звичайні типи даних. Базові типи даних в значній мірі складають все, що існує. Наприклад, там - це всі числа, знаки, булеві і т. д. Нормальні типи даних або складні типи даних - це все інше. String - це масив символів, тому складний тип даних.

Кожна створена вами змінна - це фактично вказівник на значення у вашій пам'яті. Наприклад:

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

змінна "s" НЕ містить рядка. Це вказівник. Цей вказівник вказує на змінну у вашій пам'яті. Коли ви телефонуєте System.out.println(anyObject), викликається toString()метод цього об'єкта. Якщо він не змінив значення toStringвід Object, він надрукує покажчик. Наприклад:

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), однак, порівнює вміст. Можна порівняти примітивні типи даних з оператором '==', оскільки вказівник двох різних об'єктів з однаковим вмістом є рівним.

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

Привітання


2

Для мене найкраще перевірити, чи є в рядку якийсь змістовний вміст на Java:

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

Спочатку ви перевіряєте, чи nullслід уникати рядок, NullPointerExceptionа потім обрізуєте всі символи пробілу, щоб уникнути перевірки рядків, які мають лише пробіли, і, нарешті, ви перевіряєте, чи не обрізана рядок порожня, тобто довжина 0.


1

У мене була проблема в android, і я використовую такий спосіб (Work for me):

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якщо порожній або недійсний

або ви можете використовувати спробу лову і лову, коли це недійсне.


0

Я думаю, що myString - це не рядок, а масив рядків. Ось що вам потрібно зробити:

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

Мій код призначений для обробки. Обробка - мова програмування на основі Java. Більше інформації про приєднання: treatment.org/reference/join_.html .
міміт

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.