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 */
}
/* ... */
}
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 */
}
/* ... */
}
Odpowiedzi:
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 str
jest null.
Uwaga, jest dostępna tylko od wersji Java SE 1.6. Musisz sprawdzić str.length() == 0
poprzednie 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 ) )
isEmpty()
wydaje się, że wymaga instancji String (niestatyczna). Wywołanie tego w odwołaniu zerowym spowoduje zgłoszenie wyjątku NullPointerException.
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.
(str != null && str.length() > 0)
.
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)) {
...
}
isEmpty
lub isBlank
moż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-lang
projekt zapewnia wiele użytecznych metod!
StringUtils.isNotBlank(str)
sprawdza również zerowanie.
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 null
ma sens (chociaż w przypadku SQL rozumiem, że SQL / HQL jest dziwny ''
).
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ść!
Niemal każda biblioteka wiem definiuje klasę użytkową nazwie StringUtils
, StringUtil
albo StringHelper
, i zazwyczaj obejmują sposób, którego szukasz.
Moim ulubionym jest Apache Commons / Lang , gdzie w klasie StringUtils dostajesz oba
(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.
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.
Co powiesz na:
if(str!= null && str.length() != 0 )
&&
if str == null, co zapobiegnie wyjątkowi NullPointerException. (Źródło: Właśnie próbowałem)
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.
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:
IsNotEmpty () sprawdza tylko, że parametr wejściowy jest
Zwraca wartość true lub false na podstawie danych wejściowych
Predicate<String> p = (s)-> ( s != null && !s.isEmpty());
p.test(string);
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;
}
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
});
Istnieje nowa metoda w java-11: 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, Optional
aby sprawdzić, czy ciąg znaków jest pusty lub pusty
boolean isNullOrEmpty = Optional.ofNullable(str).map(String::isBlank).orElse(true);
test jest równy pustemu ciągowi i zeru w tym samym warunku:
if(!"".equals(str) && str != null) {
// do stuff.
}
Nie wyrzuca, NullPointerException
jeś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
str != null
. !"".equals(str)
już wykonuję robotę
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.
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
}
areSet(String... strings)
można go następnie wywołać bez tworzenia tablicy:if(!StringUtils.areSet(firstName, lastName, address))
Jeśli używasz Java 8 i chcesz mieć bardziej funkcjonalne podejście do programowania, możesz zdefiniować, Function
któ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ć Function
jako
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ć, Function
który sprawdza, czy String
jest pusty, a następnie zanegować za pomocą!
.
W takim przypadku Function
bę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
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 String
literami spacji.
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
isNotBlank
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
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
Po prostu, aby zignorować również białe znaki:
if (str == null || str.trim().length() == 0) {
// str is empty
} else {
// str is not empty
}
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.
StringUtils
wyraźnie stwierdza: „Głównie do użytku wewnętrznego w ramach; rozważ Apache's Lang Lang jako bardziej wszechstronny zestaw narzędzi String”.
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")
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ść
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()));
}
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;
}
PreparedStatement
i tak zamiast konstruować zapytanie SQL za pomocą operacji podstawowych konkatenacji łańcuchów. Zapobiega wszelkim podatnościom na wstrzyknięcia, znacznie bardziej czytelnym itp.