Sprawdź, czy łańcuch nie jest pusty i nie jest pusty


490

Jak mogę sprawdzić, czy łańcuch nie jest pusty i nie jest pusty?

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

8
Prawdopodobnie powinieneś użyć PreparedStatementi tak zamiast konstruować zapytanie SQL za pomocą operacji podstawowych konkatenacji łańcuchów. Zapobiega wszelkim podatnościom na wstrzyknięcia, znacznie bardziej czytelnym itp.
polygenelubricants

2
Możesz utworzyć klasę, która będzie sprawdzać wartości zerowe lub obiekt zerowy. Że pomoże poprawy ponownego użycia zdolności .. stackoverflow.com/a/16833309/1490962
Bhushankumar Lilapara

Odpowiedzi:


895

Co z isEmpty () ?

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

Pamiętaj, aby użyć części &&w tej kolejności, ponieważ Java nie będzie oceniać drugiej części, jeśli pierwsza część się &&nie powiedzie, zapewniając w ten sposób, że nie otrzymasz wyjątku wskaźnika zerowego od str.isEmpty()if strjest null.

Uwaga, jest dostępna tylko od wersji Java SE 1.6. Musisz sprawdzić str.length() == 0poprzednie wersje.


Aby zignorować również białe znaki:

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

(ponieważ Java 11 str.trim().isEmpty()może zostać zredukowana, do str.isBlank()której będzie również testowane inne białe znaki Unicode)

Zawinięty w przydatną funkcję:

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

Staje się:

if( !empty( str ) )

80
Zauważ, że isEmpty()wydaje się, że wymaga instancji String (niestatyczna). Wywołanie tego w odwołaniu zerowym spowoduje zgłoszenie wyjątku NullPointerException.
James P.

38
Lub jeśli (str! = Null &&! Str.trim (). IsEmpty ()), aby zignorować białe znaki.
PapaFreud

if ((txt.getText (). length ()) == 0) // pobierz element z układu
jruzafa

32
Polecam użyć, TextUtils.isEmpty(String)aby sprawdzić, czy ciąg jest pusty lub zerowy. Miło i krótko. Klasa TextUtils jest częścią zestawu Android SDK.
George Maisuradze,

1
@ user1154390: czasami warto jawnie używać prawdy i fałszu dla jasności, ale gdy warunek zwraca wartość prawda dla prawdy i fałsz dla fałszu, jego niepotrzebna złożoność. Po prostu powiedz (str != null && str.length() > 0).
ToolmakerSteve

213

Użyj org.apache.commons.lang.StringUtils

Lubię używać Apache commons-lang do tego rodzaju rzeczy, a zwłaszcza klasy narzędzi StringUtils :

import org.apache.commons.lang.StringUtils;

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

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

17
czy Apache commons-lang nie jest przesadą, jeśli możesz po prostu użyć isEmpty? Po prostu ciekawy.
zengr

17
@zengr - nie, ponieważ z pewnością używałbyś również innych rzeczy :)
Bozho

2
@zengr Rzeczywiście, jeśli używasz isEmptylub isBlankmoże nie jest przydatne włączenie biblioteki innej firmy. Możesz po prostu stworzyć własną klasę narzędzi, aby zapewnić taką metodę. Jednak, jak wyjaśnia Bozho, commons-langprojekt zapewnia wiele użytecznych metod!
Romain Linsolas

13
Ponieważ StringUtils.isNotBlank(str)sprawdza również zerowanie.
sdesciencelover

1
Jeśli używasz Spring Framework, może to być JUŻ pakiet w słoikach frameworka.
linuxunil

103

Właśnie dodałem tutaj Androida:

import android.text.TextUtils;

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

1
@staticx, Metoda StringUtils zmieniła się w wersji Lang 2.0. Nie przycina już CharSequence. Ta funkcjonalność jest dostępna w isBlank ().
Nick

50

Aby dodać do @BJorn i @SeanPatrickFloyd Sposób Guava to zrobić:

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

Commons Lang jest czasami bardziej czytelny, ale powoli polegam bardziej na Guava, a czasem Commons Lang jest mylący, jeśli chodzi o isBlank()(jak w tym, co jest spacją, czy nie).

Wersja Commons Lang autorstwa Guava to isBlank:

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

Powiem, że kod, który nie pozwala ""(pusty) ORAZ null jest podejrzany i potencjalnie błędny, ponieważ prawdopodobnie nie obsługuje wszystkich przypadków, w których niedozwolone nullma sens (chociaż w przypadku SQL rozumiem, że SQL / HQL jest dziwny '').


druga Guawa też. Guawa przestrzega konwencji mnogich klas statycznych. W przypadku ciągu znaków wypróbuj ciągi znaków dla metod statycznych, takich jak isNullOrEmpty (str).
Thupten

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

alternatywnie

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

lub

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

Uwaga: Druga kontrola (pierwsza i druga alternatywa) zakłada, że ​​str nie jest zerowy. Jest w porządku tylko dlatego, że robi to pierwsza kontrola (a Java nie wykonuje drugiej kontroli, jeśli pierwsza jest fałszywa)!

WAŻNE: NIE używaj == dla równości łańcuchów. == sprawdza, czy wskaźnik jest równy, a nie wartość. Dwa ciągi znaków mogą znajdować się w różnych adresach pamięci (dwa wystąpienia), ale mają tę samą wartość!


dzięki ... str.length () działało dla mnie. Mój przypadek polegał na tym, że otrzymuję wartości z tablicy po zapytaniu z bazy danych. Nawet jeśli dane były puste, kiedy zrobiłem str. Długość, dawało „1” długość. Bardzo dziwne, ale dzięki za pokazanie mi tego.
arn-arn

Ma to związek z elementami wewnętrznymi bazy danych. Albo jest to pole char zamiast pola varchar (więc uzupełnia się spacjami) lub baza danych nie lubi pustych ciągów. Myślę, że najlepiej jest wstępnie przetworzyć te wartości po / podczas zapytania (w dostępie do danych w dalszej części aplikacji).
helios

Myślę, że sprawdzanie długości jest lepsze niż „równe”, ponieważ jest to operacja O (1), ponieważ długość jest buforowana w przypadku String.
bluelurker,

26

Niemal każda biblioteka wiem definiuje klasę użytkową nazwie StringUtils, StringUtilalbo StringHelper, i zazwyczaj obejmują sposób, którego szukasz.

Moim ulubionym jest Apache Commons / Lang , gdzie w klasie StringUtils dostajesz oba

  1. StringUtils.isEmpty (String) i
  2. StringUtils.isBlank (ciąg) Sposób

(Pierwszy sprawdza, czy łańcuch jest pusty, czy drugi, czy jest pusty, czy zawiera tylko białe znaki)

Istnieją podobne klasy narzędzi w Spring, Wicket i wiele innych bibliotek. Jeśli nie korzystasz z bibliotek zewnętrznych, możesz chcieć wprowadzić klasę StringUtils we własnym projekcie.


Aktualizacja: wiele lat minęło, a te dni, polecam za pomocą Guava „s Strings.isNullOrEmpty(string)metody.


Chciałbym zapytać, dlaczego polecasz to teraz? Chciałbym wiedzieć, czy istnieje różnica między Strings.isNullOrEmpty (string) i StringUtils.isEmpty (String)
namiestnik

Metody @vicangel Apache Commons są pełne założeń i rzeczy, o które nie prosiłem. Dzięki Guava dostaję dokładnie to, o co prosiłem i nic więcej lub mniej
Sean Patrick Floyd

24

To działa dla mnie:

import com.google.common.base.Strings;

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

Zwraca true, jeśli podany ciąg ma wartość NULL lub jest łańcuchem pustym.

Rozważ normalizację odwołań do ciągu za pomocą nullToEmpty. Jeśli to zrobisz, możesz użyć String.isEmpty () zamiast tej metody i nie będziesz potrzebować specjalnych form bezpiecznych dla wartości zerowych, takich jak String.toUpperCase. Lub, jeśli chcesz znormalizować „w innym kierunku”, konwertując puste ciągi na null, możesz użyć emptyToNull.


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

11

Co powiesz na:

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

zgłasza wyjątek NullPointerException, jeśli str ma wartość NULL.
Mindwin

13
@Mindwin To nieprawda. Nie wykona kodu po prawej stronie &&if str == null, co zapobiegnie wyjątkowi NullPointerException. (Źródło: Właśnie próbowałem)
Zach Lysobey

Poprawiono mnie. Nie usunie komentarza ze wstydu, więc Zach i GI Joe nie pozostaną z odpowiedziami pojawiającymi się znikąd. Lolz. Ale miło to wiedzieć, że to pomijanie może powodować logiczne niepowodzenia, jeśli wykonasz coś innego niż tylko testowanie rzeczy i zwrócisz wartość logiczną pomijanych wywołań metod.
Mindwin

2
@Mindwin Fajnie jest wiedzieć, jak działa język, którego używasz. Jeśli nie rozumiesz oceny zwarcia, albo go nie używaj, albo, lepiej, dowiedz się o tym.
Markiz Lorne

7

Użyj metody isNotBlank Apache StringUtils jak

StringUtils.isNotBlank(str)

Zwróci true tylko wtedy, gdy str nie ma wartości null i nie jest puste.


właściwie jeśli str ma tutaj wartość null, instrukcja zwraca true
Alexandr

To prawda, mój zły !! Zamiast tego skorzystałby z StringUtils.isNotEmpty (str) apache-commons.
Null Pointer

6

Powinieneś użyć org.apache.commons.lang3.StringUtils.isNotBlank()lub org.apache.commons.lang3.StringUtils.isNotEmpty. Decyzja między tymi dwoma opiera się na tym, co naprawdę chcesz sprawdzić.

W isNotBlank () sprawdza, czy parametr wejściowy wynosi:

  • Nie jest zerem,
  • nie pusty ciąg („”)
  • nie sekwencja białych znaków („”)

IsNotEmpty () sprawdza tylko, że parametr wejściowy jest

  • Nie jest zerem
  • nie pusty ciąg („”)

6

Zwraca wartość true lub false na podstawie danych wejściowych

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

5

Jeśli nie chcesz uwzględniać całej biblioteki; po prostu dołącz żądany kod. Będziesz musiał sam to utrzymać; ale jest to dość prosta funkcja. Tutaj jest kopiowany z 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

Jest trochę za późno, ale oto funkcjonalny styl sprawdzania:

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

1
Polecam użycie mapy do wykończenia, np .: Optional.ofNullable (str) .map (String :: trim) .filter (String :: isEmpty) .ifPresent (this :: setStringMethod);
bachph

5

Istnieje nowa metoda w : String#isBlank

Zwraca true, jeśli łańcuch jest pusty lub zawiera tylko białe znaki kodowe, w przeciwnym razie false.

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

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

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

Można to połączyć z, Optionalaby sprawdzić, czy ciąg znaków jest pusty lub pusty

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

Ciąg # isBlank


3

test jest równy pustemu ciągowi i zeru w tym samym warunku:

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

Nie wyrzuca, NullPointerExceptionjeśli str ma wartość null, ponieważ Object.equals()zwraca false, jeśli argument ma wartość null.

drugi konstrukt str.equals("")rzuciłby przerażenie NullPointerException. Niektórzy mogą rozważyć złą formę, używając dosłownego ciągu jako obiektu, który equals()zostanie wywołany, ale spełnia swoją rolę.

Sprawdź również tę odpowiedź: https://stackoverflow.com/a/531825/1532705


1
więc po co dodawać kod nigdy nie osiągnięty str != null. !"".equals(str)już wykonuję robotę
amdev

3

Proste rozwiązanie:

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

2

Jak powiedział powyżej seanizer, Apache StringUtils jest do tego fantastyczny, jeśli chcesz włączyć guawę, wykonaj następujące czynności;

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

Czy mogę również polecić odwoływanie się do kolumn w zestawie wyników według nazwy, a nie indeksu, co znacznie ułatwi obsługę kodu.


Nie trzeba jednak używać apache commons z guawy, w guava istnieje również klasa Strings: guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/…
Sean Patrick Floyd

Dodałem kilka przykładów Guava dla początkujących użytkowników Java, którzy trafili na to pytanie: stackoverflow.com/a/13146903/318174 .
Adam Gent

2

Stworzyłem własną funkcję narzędziową do sprawdzania kilku ciągów naraz, zamiast mieć pełną instrukcję if if(str != null && !str.isEmpty && str2 != null && !str2.isEmpty). To jest funkcja:

public class StringUtils{

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

        return true;
    }   

}

więc mogę po prostu napisać:

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

2
Lepiej byłoby użyć podpisu: areSet(String... strings)można go następnie wywołać bez tworzenia tablicy:if(!StringUtils.areSet(firstName, lastName, address))
weston

2

Jeśli używasz Java 8 i chcesz mieć bardziej funkcjonalne podejście do programowania, możesz zdefiniować, Functionktóry zarządza kontrolą, a następnie możesz użyć go ponownie iapply() kiedy zajdzie taka potrzeba.

Idąc do praktyki, możesz zdefiniować Functionjako

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

Następnie możesz go użyć, po prostu wywołując apply()metodę jako:

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

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

Jeśli wolisz, możesz zdefiniować, Functionktóry sprawdza, czy Stringjest pusty, a następnie zanegować za pomocą! .

W takim przypadku Functionbędzie wyglądać następująco:

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

Następnie możesz go użyć, po prostu wywołując apply()metodę jako:

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

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

W ten sposób lubię to robić, gdy martwię się kosztem wydajności lub efektami ubocznymi i nie mam łatwego dostępu do importu.
david.pfx

2

Za pomocą Java 8 Optional możesz:

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

W tym wyrażeniu poradzisz sobie również z Stringliterami spacji.


1

Możesz użyć StringUtils.isEmpty (). Wynik będzie prawdziwy, jeśli łańcuch będzie zerowy lub pusty.

 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");
 }

spowoduje

str1 jest zerowy lub pusty

str2 ma wartość NULL lub jest puste


Lub po prostu użyjisNotBlank
Brian

1

Poradziłbym Guava lub Apache Commons zgodnie z twoją rzeczywistą potrzebą. Sprawdź różne zachowania w moim przykładowym kodzie:

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");
    }
  }
}

Wynik:
Apache:
a jest puste
b jest puste
c jest puste
Google:
b to NullOrEmpty
c to NullOrEmpty


1

Jeśli używasz Spring Boot, poniższy kod wykona zadanie

StringUtils.hasLength(str)

0

Dla kompletności: jeśli już korzystasz ze struktury Spring , StringUtils udostępnia metodę

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

Zwraca: true, jeśli Łańcuch nie jest pusty i ma długość

jak również metoda

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

Zwraca: true, jeśli Łańcuch nie jest pusty, jego długość jest większa od 0 i nie zawiera tylko białych znaków


możemy użyć metody StringUtils.isEmpty (param).
Supun Dharmarathne

0

Po prostu, aby zignorować również białe znaki:

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

0

Jeśli używasz platformy Spring, możesz użyć metody:

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

Ta metoda przyjmuje dowolny obiekt jako argument, porównując go do wartości null i pustego ciągu. W rezultacie ta metoda nigdy nie zwróci wartości true dla niepustego obiektu innego niż String.


1
Zauważ, że dokumentacja StringUtilswyraźnie stwierdza: „Głównie do użytku wewnętrznego w ramach; rozważ Apache's Lang Lang jako bardziej wszechstronny zestaw narzędzi String”.
Fredrik Jonsén

0

Lepszym sposobem obsługi wartości null w ciągu jest

str!=null && !str.equalsIgnoreCase("null") && !str.isEmpty()

W skrócie,

str.length()>0 && !str.equalsIgnoreCase("null")

0

Aby sprawdzić, czy wszystkie atrybuty łańcucha w obiekcie są puste (Zamiast używać! = Null dla wszystkich nazw pól po podejściu API do Java odbicie

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

Ta metoda zwróciłaby wartość true, jeśli wszystkie wartości pola String są puste, Zwróciłaby wartość false, jeśli w atrybutach String występuje jedna wartość


0

Zetknąłem się z sytuacją, w której muszę sprawdzić, czy „null” (jako ciąg znaków) należy uznać za pusty. Również biała spacja i rzeczywista wartość null muszą zwracać wartość true. W końcu zdecydowałem się na następującą funkcję ...

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

0

W przypadku konieczności zweryfikowania parametrów metody można użyć prostej metody

public class StringUtils {

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

}

Przykład:

public String concatenate(String firstName, String lastName) {
    if(StringUtils.anyBlankString(firstName, lastName)) {
        throw new IllegalArgumentException("Empty field found");
    }
    return firstName + " " + lastName;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.