Перевірте, чи рядок не є нульовим та не порожнім


490

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

public void doStuff(String str)
{
    if (str != null && str != "**here I want to check the 'str' is empty or not**")
    {
        /* handle empty string */
    }
    /* ... */
}

8
Вам, мабуть, слід використовувати PreparedStatementтаку, а не побудову SQL-запиту за допомогою рядкових примітивів конкатенації. Уникає всі види вразливостей для ін'єкцій, набагато більш зручним для читання і т.д.
polygenelubricants

2
Ви можете створити клас, який перевірятиме на нульові значення чи нульовий об’єкт. Це допоможе вам поліпшення повторного використання здатності .. stackoverflow.com/a/16833309/1490962
Bhushankumar Lilapara

Відповіді:


895

Що щодо isEmpty () ?

if(str != null && !str.isEmpty())

Обов’язково використовуйте частини &&цього порядку, тому що java не буде переходити до оцінки другої частини, якщо перша частина &&не вдасться, таким чином гарантуючи, що ви не отримаєте нульове виключення вказівника з, str.isEmpty()якщо strє null.

Обережно, він доступний лише з Java SE 1.6. Ви повинні перевірити str.length() == 0попередні версії.


Щоб ігнорувати пробіли:

if(str != null && !str.trim().isEmpty())

(оскільки Java 11 str.trim().isEmpty()можна зменшити, до str.isBlank()чого також буде перевірено інші пробіли Unicode)

Згорнутий у зручну функцію:

public static boolean empty( final String s ) {
  // Null-safe, short-circuit evaluation.
  return s == null || s.trim().isEmpty();
}

Стає:

if( !empty( str ) )

80
Зауважте, що, isEmpty()здається, потрібен екземпляр String (нестатичний). Викликання цього на нульове посилання призведе до виведення NullPointerException.
Джеймс П.

38
Або якщо (str! = Null &&! Str.trim (). IsEmpty ()), ігнорувати пробіли.
PapaFreud

if ((txt.getText (). length ()) == 0) // отримати елемент з верстки
jruzafa

32
Я рекомендую використовувати TextUtils.isEmpty(String)для перевірки, чи є рядок порожнім або нульовим. Приємний і короткий. Клас TextUtils є частиною Android SDK.
Джордж Майсурадзе

1
@ user1154390: іноді варто чітко використовувати істинну та хибну для ясності, але коли умова повертає істинне для істинного, а хибне - для помилкового, його непотрібна складність. Просто скажіть (str != null && str.length() > 0).
ToolmakerSteve

213

Використовуйте org.apache.commons.lang.StringUtils

Мені подобається використовувати Apache commons-lang для таких речей, і особливо класу утиліти StringUtils :

import org.apache.commons.lang.StringUtils;

if (StringUtils.isNotBlank(str)) {
    ...
} 

if (StringUtils.isBlank(str)) {
    ...
} 

17
чи не Apache commons-lang overkill, якщо ви можете просто використовувати isEmpty? Просто цікаво.
zengr

17
@zengr - ні, тому що ти, звичайно, також використовуєш і інші речі :)
Божо

2
@zengr Дійсно, якщо ви тільки використовуєте isEmptyабо isBlank, можливо, не корисно включати сторонні бібліотеки. Ви можете просто створити свій власний клас корисності для надання такого способу. Однак, як пояснює Божо, commons-langпроект надає багато корисних методів!
Ромен Лінсолас

13
Тому що StringUtils.isNotBlank(str)робить і перевірку нуля.
sdesciencelover

1
Якщо ви використовуєте Spring Framework, це може ВИНАГО бути вкладеним у банки з рамкою.
linuxunil

103

Просто додайте Android сюди:

import android.text.TextUtils;

if (!TextUtils.isEmpty(str)) {
...
}

1
@staticx, метод StringUtils змінився у версії Lang 2.0. Він більше не обробляє CharSequence. Ця функціональність доступна в isBlank ().
Нік

50

Щоб додати до @BJorn та @SeanPatrickFloyd Спосіб Guava це:

Strings.nullToEmpty(str).isEmpty(); 
// or
Strings.isNullOrEmpty(str);

Commons Lang часом легше читається, але я повільно більше покладаюсь на Гуаву плюс іноді Commons Lang є заплутаною, коли мова йде про isBlank()(як у білому просторі чи ні).

Версія Commons Lang від Guava була isBlankб такою:

Strings.nullToEmpty(str).trim().isEmpty()

Я скажу код, який не дозволяє ""(порожній) І null є підозрілим і потенційно баггі в тому, що він, ймовірно, не обробляє всі випадки, коли заборона не nullмає сенсу (хоча для SQL я розумію, як SQL / HQL дивно '').


друга Гуава теж. Гуава дотримується конвенції множинних статичних класів. Для String спробуйте Strings для статичних методів, таких як isNullOrEmpty (str).
Thupten

34
str != null && str.length() != 0

альтернативно

str != null && !str.equals("")

або

str != null && !"".equals(str)

Примітка: Друга перевірка (перша та друга альтернативи) передбачає, що str не є нульовим. Це нормально лише тому, що це робить перша перевірка (а Java не робить другу перевірку, якщо перша помилкова)!

ВАЖЛИВО: НЕ використовуйте == для рівності рядків. == перевіряє, що покажчик дорівнює, а не значення. Два рядки можуть бути в різних адресах пам'яті (два екземпляри), але мати однакове значення!


дякую ... str.length () працював на мене. Мій випадок полягав у тому, що я отримую значення з масиву після запитів із бази даних. Навіть якщо дані були порожніми, коли я робив строку довжини, вона давала "1" довжину. Дуже дивно, але дякую, що показали мені це.
arn-arn

Це стосується внутрішніх даних бази даних. Або це поле char замість поля varchar (значить, колодки з пробілами) або база даних не любить порожні рядки. Я думаю, що найкраще - попередньо обробити ці значення після / під час запитів (у доступі до даних пізніше програми).
геліос

Я думаю, що перевірити довжину краще, ніж "дорівнює", тому що це операція O (1), оскільки довжина кешується у разі String.
bluelurker

26

Майже кожна бібліотека, яку я знаю, визначає клас утиліти, який називається StringUtils, StringUtilабо StringHelper, і вони зазвичай включають метод, який ви шукаєте.

Мій особистий фаворит - Apache Commons / Lang , де в класі StringUtils ви отримуєте обидва

  1. StringUtils.isEmpty (String) і
  2. StringUtils.isBlank (String) метод

(Перший перевіряє, чи є рядок нульовим чи порожнім, другий перевіряє, чи є нульовим, порожнім чи лише пробілом)

Існують подібні класи корисних програм у Spring, Wicket та багато інших ліб. Якщо ви не використовуєте зовнішні бібліотеки, можливо, ви захочете ввести клас StringUtils у свій власний проект.


Минуло багато років, і в ці дні я б рекомендував використовувати: Update Guava «s Strings.isNullOrEmpty(string)метод.


Я хотів би запитати, чому ви зараз це рекомендуєте? Мені хотілося б знати, чи є різниця між Strings.isNullOrEmpty (string) та StringUtils.isEmpty (String)
vicangel

Методи @vicangel Apache Commons сповнені припущень і того, чого я не просив. З Гуавою я отримую саме те, про що я просив, і нічого більш-менш
Шон Патрік Флойд

24

Це працює для мене:

import com.google.common.base.Strings;

if (!Strings.isNullOrEmpty(myString)) {
       return myString;
}

Повертає true, якщо вказаний рядок є нульовим або порожній рядок.

Подумайте про нормалізацію посилань на рядок за допомогою nullToEmpty. У цьому випадку ви можете використовувати String.isEmpty () замість цього методу, і вам не знадобляться спеціальні безпечні форми таких методів, як String.toUpperCase. Або, якщо ви хочете нормалізувати "в інший бік", перетворюючи порожні рядки в нульові, ви можете використовувати emptyToNull.


2
<dependency> <groupId> com.google.guava </groupId> <artifactId> guava </artifactId> <version> 12.0 </version> </dependency>
Junchen Liu

11

Як щодо:

if(str!= null && str.length() != 0 )

кидає NullPointerException, якщо str - NULL.
Міндвін

13
@Mindwin Це неправда. Він не буде виконувати код праворуч від параметра &&if str == null, тим самим запобігаючи NullPointerException. (Джерело: Я щойно спробував)
Зах Лісобей

Я стою виправлений. Не видаляю коментар від сорому, тому Зак і Дж. І. Джо не залишаться відповідей, що вивішуються з нізвідки. Лолц. Але приємно знати, що це пропуск може спричинити логічні збої, якщо ви робите щось інше, ніж просто тестування матеріалів та повертаєте булеву інформацію про пропущені виклики методу.
Міндвін

2
@Mindwin Приємно знати, як працює мова, якою ви користуєтесь. Якщо ви не розумієте оцінку короткого замикання, або не використовуйте її, а ще краще, дізнайтеся про це.
Маркіз Лорн

7

Використовуйте такий метод isNotBlank Apache StringUtils, як

StringUtils.isNotBlank(str)

Він повернеться істинним, лише якщо str не є нульовим та не порожнім.


насправді, якщо str тут недійсне, твердження повертається істинним
Олександр

Це правда, моя погана !! Натомість використання apache-commons 'StringUtils.isNotEmpty (str) зробить цю роботу.
Нульовий покажчик

6

Ви повинні використовувати org.apache.commons.lang3.StringUtils.isNotBlank()абоorg.apache.commons.lang3.StringUtils.isNotEmpty . Рішення між цими двома ґрунтується на тому, що ви насправді хочете перевірити.

У isNotBlank () перевіряє , що вхідний параметр є:

  • не Null,
  • не порожній рядок ("")
  • не послідовність символів пробілів ("")

IsNotEmpty () перевіряє тільки те , що вхідний параметр є

  • не нульовий
  • не порожня рядок ("")

6

Повертає значення true чи false на основі введених даних

Predicate<String> p = (s)-> ( s != null && !s.isEmpty());
p.test(string);

5

Якщо ви не хочете включати всю бібліотеку; просто включіть з нього потрібний код. Вам доведеться підтримувати це самостійно; але це досить пряма функція вперед. Ось це скопійовано з commons.apache.org

    /**
 * <p>Checks if a String is whitespace, empty ("") or null.</p>
 *
 * <pre>
 * StringUtils.isBlank(null)      = true
 * StringUtils.isBlank("")        = true
 * StringUtils.isBlank(" ")       = true
 * StringUtils.isBlank("bob")     = false
 * StringUtils.isBlank("  bob  ") = false
 * </pre>
 *
 * @param str  the String to check, may be null
 * @return <code>true</code> if the String is null, empty or whitespace
 * @since 2.0
 */
public static boolean isBlank(String str) {
    int strLen;
    if (str == null || (strLen = str.length()) == 0) {
        return true;
    }
    for (int i = 0; i < strLen; i++) {
        if ((Character.isWhitespace(str.charAt(i)) == false)) {
            return false;
        }
    }
    return true;
}

5

Трохи пізно, але ось функціональний стиль перевірки:

Optional.ofNullable(str)
    .filter(s -> !(s.trim().isEmpty()))
    .ifPresent(result -> {
       // your query setup goes here
    });

1
Я рекомендую використовувати карту для обрізки, наприклад: Необов'язково.ofNullable (str) .map (String :: trim) .filter (String :: isEmpty) .ifPresent (це :: setStringMethod);
Бахф

5

Існує новий метод в : String#isBlank

Повертає true, якщо рядок порожній або містить лише кодові точки білого пробілу, інакше false.

jshell> "".isBlank()
$7 ==> true

jshell> " ".isBlank()
$8 ==> true

jshell> " ! ".isBlank()
$9 ==> false

Це може бути поєднано з тим, Optionalщоб перевірити, чи рядок є нульовим чи порожнім

boolean isNullOrEmpty = Optional.ofNullable(str).map(String::isBlank).orElse(true);

Рядок # isBlank


3

тест дорівнює порожньому рядку і нулю в тому ж умовному:

if(!"".equals(str) && str != null) {
    // do stuff.
}

Не кидає, NullPointerExceptionякщо str нульовий, оскільки Object.equals()повертає false, якщо arg null.

інша конструкція str.equals("")кинула б то боязнь NullPointerException. Деякі можуть вважати погану форму, використовуючи лінійку String як об'єкт, на equals()який викликається, але це робить роботу.

Також перевірте цю відповідь: https://stackoverflow.com/a/531825/1532705


1
тож чому додати ніколи не досягнутий код str != null. !"".equals(str)вже робіть роботу
amdev

3

Просте рішення:

private boolean stringNotEmptyOrNull(String st) {
    return st != null && !st.isEmpty();
}

2

Як сказав Seanizer вище, Apache StringUtils є фантастичним для цього, якщо ви включили гуаву, вам слід зробити наступне;

public List<Employee> findEmployees(String str, int dep) {
 Preconditions.checkState(StringUtils.isNotBlank(str), "Invalid input, input is blank or null");
 /** code here **/
}

Можна також рекомендувати вам звертатися до стовпців у вашому результаті, встановлених по імені, а не по індексу, це полегшить ваш код у підтримці.


Немає необхідності користуватися апаш-спільнотою від guava, хоча в guava також існує клас Strings: guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/…
Шон Патрік Флойд

Я додав кілька прикладів Guava для початківців користувачів Java, які орієнтуються на це питання: stackoverflow.com/a/13146903/318174 .
Адам Гент

2

Я зробив власну функцію утиліти, щоб перевірити відразу декілька рядків, а не мати виписку if if(str != null && !str.isEmpty && str2 != null && !str2.isEmpty). Це функція:

public class StringUtils{

    public static boolean areSet(String... strings)
    {
        for(String s : strings)
            if(s == null || s.isEmpty)
                return false;

        return true;
    }   

}

тому я можу просто написати:

if(!StringUtils.areSet(firstName,lastName,address)
{
    //do something
}

2
Було б приємніше використовувати підпис: areSet(String... strings)тоді можна викликати без створення масиву:if(!StringUtils.areSet(firstName, lastName, address))
weston

2

Якщо ви використовуєте Java 8 і хочете скористатися більш функціональним підходом до програмування, ви можете визначити, Functionщо керує елементом управління, а потім ви можете використовувати його повторно та apply()коли це буде потрібно.

Прийшовши на практику, ви можете визначити Functionяк

Function<String, Boolean> isNotEmpty = s -> s != null && !"".equals(s)

Потім ви можете використовувати його, просто зателефонувавши apply()методу як:

String emptyString = "";
isNotEmpty.apply(emptyString); // this will return false

String notEmptyString = "StackOverflow";
isNotEmpty.apply(notEmptyString); // this will return true

Якщо ви віддаєте перевагу, ви можете визначити, Functionщо перевіряє, чи Stringє порожнім, а потім заперечувати його !.

У цьому випадку Functionзаповіт виглядатиме так:

Function<String, Boolean> isEmpty = s -> s == null || "".equals(s)

Потім ви можете використовувати його, просто зателефонувавши apply()методу як:

String emptyString = "";
!isEmpty.apply(emptyString); // this will return false

String notEmptyString = "StackOverflow";
!isEmpty.apply(notEmptyString); // this will return true

Ось як мені подобається це робити, коли я переживаю за вартість продуктивності або побічні ефекти, і жоден імпорт легко не здається.
david.pfx

2

З додатком Java 8 ви можете:

public Boolean isStringCorrect(String str) {
    return Optional.ofNullable(str)
            .map(String::trim)
            .map(string -> !str.isEmpty())
            .orElse(false);
}

У цьому виразі ви будете обробляти Strings, які також складаються з пробілів.


1

Ви можете використовувати StringUtils.isEmpty (), це призведе до істини, якщо рядок є нульовою або порожньою.

 String str1 = "";
 String str2 = null;

 if(StringUtils.isEmpty(str)){
     System.out.println("str1 is null or empty");
 }

 if(StringUtils.isEmpty(str2)){
     System.out.println("str2 is null or empty");
 }

призведе до

str1 є нульовим або порожнім

str2 є нульовим або порожнім


Або просто скористайтесяisNotBlank
Брайан

1

Я б порадив Guava або Apache Commons відповідно до вашої реальної потреби. Перевірте різні типи поведінки в моєму прикладі коду:

import com.google.common.base.Strings;
import org.apache.commons.lang.StringUtils;

/**
 * Created by hu0983 on 2016.01.13..
 */
public class StringNotEmptyTesting {
  public static void main(String[] args){
        String a = "  ";
        String b = "";
        String c=null;

    System.out.println("Apache:");
    if(!StringUtils.isNotBlank(a)){
        System.out.println(" a is blank");
    }
    if(!StringUtils.isNotBlank(b)){
        System.out.println(" b is blank");
    }
    if(!StringUtils.isNotBlank(c)){
        System.out.println(" c is blank");
    }
    System.out.println("Google:");

    if(Strings.isNullOrEmpty(Strings.emptyToNull(a))){
        System.out.println(" a is NullOrEmpty");
    }
    if(Strings.isNullOrEmpty(b)){
        System.out.println(" b is NullOrEmpty");
    }
    if(Strings.isNullOrEmpty(c)){
        System.out.println(" c is NullOrEmpty");
    }
  }
}

Результат:
Apache:
a пустий
b порожній
c порожній
Google:
b є NullOrEmpty
c є NullOrEmpty


1

Якщо ви використовуєте Spring Boot, робота нижче буде виконана

StringUtils.hasLength(str)

0

Для повноти: Якщо ви вже використовуєте рамку Spring , метод StringUtils надає метод

org.springframework.util.StringUtils.hasLength(String str)

Повертає: true, якщо String не є нульовим і має довжину

а також метод

org.springframework.util.StringUtils.hasText(String str)

Повертає: true, якщо рядок не є нульовим, його довжина перевищує 0, і вона не містить лише пробілів


ми можемо використовувати метод StringUtils.isEmpty (param).
Супун Дармаратна

0

Просто, щоб ігнорувати пробіл:

if (str == null || str.trim().length() == 0) {
    // str is empty
} else {
    // str is not empty
}

0

Якщо ви використовуєте Spring Framework, тоді ви можете використовувати метод:

org.springframework.util.StringUtils.isEmpty(@Nullable Object str);

Цей метод приймає будь-який Об'єкт як аргумент, порівнюючи його з нулем і порожнім рядком. Як наслідок, цей метод ніколи не поверне істину для ненульового нестрокового об'єкта.


1
Зауважте, що в документації StringUtilsпрямо вказано "В основному для внутрішнього використання в рамках; розгляньте Apache's Commons Lang для більш всебічного набору String утиліт".
Фредрік Джонсен


0

Щоб перевірити, чи всі атрибути рядка в об’єкті порожні (Замість того, щоб використовувати! = Null для всіх імен полів після підходу api-відображення Java-відображення

private String name1;
private String name2;
private String name3;

public boolean isEmpty()  {

    for (Field field : this.getClass().getDeclaredFields()) {
        try {
            field.setAccessible(true);
            if (field.get(this) != null) {
                return false;
            }
        } catch (Exception e) {
            System.out.println("Exception occurred in processing");
        }
    }
    return true;
}

Цей метод повертає true, якщо всі значення поля String порожні, він поверне помилковим, якщо в атрибутах String є одне значення


0

Я зіткнувся з ситуацією, коли я повинен перевірити, що "null" (як рядок) слід вважати порожнім. Також пробіл та фактична нуль повинні повернути істину. Я нарешті зупинився на наступній функції ...

public boolean isEmpty(String testString) {
  return ((null==testString) || "".equals((""+testString).trim()) || "null".equals((""+testString).toLowerCase()));
}

0

Якщо вам потрібно перевірити параметри методу, ви можете скористатися простим методом

public class StringUtils {

    static boolean anyEmptyString(String ... strings) {
        return Stream.of(strings).anyMatch(s -> s == null || s.isEmpty());
    }

}

Приклад:

public String concatenate(String firstName, String lastName) {
    if(StringUtils.anyBlankString(firstName, lastName)) {
        throw new IllegalArgumentException("Empty field found");
    }
    return firstName + " " + lastName;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.