web-dev-qa-db-fra.com

Vérifier si une chaîne n'est ni nulle ni vide

Comment puis-je vérifier si une chaîne n'est ni nulle ni vide?

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

Qu'en est-il isEmpty () ?

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

Veillez à utiliser les parties de && dans cet ordre, car Java ne procédera pas à l'évaluation de la deuxième partie si la première partie de && échoue. Ainsi, vous ne recevrez pas d'exception de pointeur null de str.isEmpty() si str est null.

Attention, il n'est disponible que depuis Java SE 1.6. Vous devez vérifier str.length() == 0 sur les versions précédentes.


Pour ignorer également les espaces:

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

(puisque Java 11 str.trim().isEmpty() peut être réduit à str.isBlank(), ce qui permettra également de tester d'autres espaces blancs Unicode)

Enveloppé dans une fonction pratique:

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

Devient:

if( !empty( str ) )
838
Colin Hebert

Utilisez org.Apache.commons.lang.StringUtils

J'aime utiliser Apache commons-lang pour ce genre de choses, et particulièrement la classe StringUtils utility:

import org.Apache.commons.lang.StringUtils;

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

if (StringUtils.isBlank(str)) {
    ...
} 
193
Romain Linsolas

Il suffit d'ajouter Android ici:

import Android.text.TextUtils;

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

Pour ajouter à @BJorn et @SeanPatrickFloyd La façon de faire ceci est la suivante: 

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

Commons Lang est parfois plus lisible, mais je m'appuie lentement sur Guava et parfois sur Commons Lang est déroutant lorsqu'il est question de isBlank() (comme dans un espace ou non).

La version de Commons Lang isBlank de Guava serait:

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

Je dirai que le code qui ne permet pas à "" (vide)ETnull est suspect et potentiellement bogué dans la mesure où il ne gère probablement pas tous les cas où n'autorisant pas null est logique (bien que je puisse comprendre pour SQL comme SQL/HQL est bizarre sur '').

42
Adam Gent
str != null && str.length() != 0

alternativement

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

ou

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

Remarque: La deuxième vérification (première et deuxième alternatives) suppose que str n'est pas nul. C'est ok seulement parce que la première vérification est faite (et Java ne fait pas la deuxième vérification si la première est fausse)!

IMPORTANT: NE PAS utiliser == pour l'égalité des chaînes. == vérifie que le pointeur est égal, pas la valeur. Deux chaînes peuvent être dans des adresses mémoire différentes (deux instances) mais ont la même valeur!

33
helios

Cela fonctionne pour moi:

import com.google.common.base.Strings;

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

Renvoie true si la chaîne donnée est null ou est la chaîne vide.

Pensez à normaliser vos références de chaîne avec nullToEmpty. Si vous Pour ce faire, vous pouvez utiliser String.isEmpty () à la place de cette méthode, mais pas besoin de formes spéciales de méthodes null-safe comme String.toUpperCase non plus. Ou, si vous souhaitez normaliser "dans l'autre sens", " convertir des chaînes vides en null, vous pouvez utiliser emptyToNull.

24
Javatar

Presque toutes les bibliothèques que je connais définissent une classe d’utilitaires appelée StringUtils, StringUtil ou StringHelper et elles incluent généralement la méthode que vous recherchez.

Mon favori personnel est Apache Commons/Lang , où dans le StringUtils class, vous obtenez les deux 

  1. StringUtils.isEmpty (String) et le
  2. StringUtils.isBlank (String) method

(Le premier vérifie si une chaîne est nulle ou vide, le second vérifie si elle est vide, vide ou uniquement)

Il existe des classes d'utilitaires similaires dans Spring, Wicket et beaucoup d'autres bibliothèques. Si vous n'utilisez pas de bibliothèques externes, vous pouvez introduire une classe StringUtils dans votre propre projet . </ S>


Mise à jour: de nombreuses années ont passé et je recommande ces jours-ci d'utiliser la méthode Guava 's Strings.isNullOrEmpty(string) .

23
Sean Patrick Floyd

Que diriez-vous:

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

Utilisez la méthode isNotBlank de Apache StringUtils comme 

StringUtils.isNotBlank(str)

Il ne retournera vrai que si str n'est pas nul et n'est pas vide.

7
A Null Pointer

Vous devez utiliser org.Apache.commons.lang3.StringUtils.isNotBlank() ou org.Apache.commons.lang3.StringUtils.isNotEmpty. La décision entre ces deux est basée sur ce que vous voulez vérifier. 

Le isNotBlank () vérifie que le paramètre d'entrée est: 

  • pas nul,
  • pas la chaîne vide ("")
  • pas une séquence de caractères d'espacement ("")

Le isNotEmpty () vérifie seulement que le paramètre d’entrée est 

  • pas nul
  • pas la chaîne vide ("")
6
gprasant

Si vous ne voulez pas inclure toute la bibliothèque; incluez simplement le code que vous voulez en tirer. Vous devrez le maintenir vous-même; mais c'est une fonction assez simple. Ici, il est copié de 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
Tom

C'est un peu trop tard, mais voici un style de vérification fonctionnel:

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

Renvoie vrai ou faux en fonction de l'entrée

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

Il y a une nouvelle méthode dans Java-11 : String#isBlank

Renvoie true si la chaîne est vide ou ne contient que des points de code d'espaces, sinon false.

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

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

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

Ceci peut être combiné avec Optional pour vérifier si la chaîne est nulle ou vide

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

String # isBlank

4
Anton Balaniuc

test est égal à avec une chaîne vide et null dans la même condition:

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

Ne lance pas NullPointerException si str est null, puisque Object.equals() renvoie false si arg est null.

l'autre construction str.equals("") jetterait le redouté NullPointerException. Certains pourraient considérer une mauvaise forme en utilisant un littéral String comme objet sur lequel equals() est appelé, mais cela fait le travail. 

Cochez également cette réponse: https://stackoverflow.com/a/531825/1532705

3
Mindwin

Solution simple: 

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

Comme dit seanizer ci-dessus, Apache StringUtils est fantastique pour cela. Si vous incluiez de la goyave, vous devriez faire ce qui suit:

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

Puis-je également vous recommander de faire référence aux colonnes de votre jeu de résultats par nom plutôt que par index, cela rendra votre code beaucoup plus facile à gérer.

2
BjornS

J'ai créé ma propre fonction utilitaire pour vérifier plusieurs chaînes à la fois, plutôt que d'avoir une instruction if remplie de if(str != null && !str.isEmpty && str2 != null && !str2.isEmpty). C'est la fonction:

public class StringUtils{

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

        return true;
    }   

}

pour que je puisse simplement écrire:

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

Si vous utilisez Java 8 et souhaitez adopter une approche de programmation plus fonctionnelle, vous pouvez définir une variable Function qui gère le contrôle. Vous pouvez ensuite la réutiliser ainsi que apply() chaque fois que nécessaire.

En venant à la pratique, vous pouvez définir la Function comme 

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

Ensuite, vous pouvez l’utiliser en appelant simplement la méthode apply() en tant que:

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

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

Si vous préférez, vous pouvez définir une Function qui vérifie si la String est vide, puis l'annuler avec !.

Dans ce cas, la Function ressemblera à:

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

Ensuite, vous pouvez l’utiliser en appelant simplement la méthode apply() en tant que:

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

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

Vous pouvez utiliser StringUtils.isEmpty (). Le résultat sera true si la chaîne est null ou vide.

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

aura pour résultat

str1 est null ou vide

str2 est nul ou vide

1
Vivek Vermani

Je conseillerais Guava ou Apache Commons en fonction de vos besoins réels. Vérifiez les différents comportements dans mon exemple de code:

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

Résultat:
Apache:
a est vide
b est vide
c est vide
Google:
b est NullOrEmpty
c est NullOrEmpty

1
BlondCode

Si vous utilisez Spring Boot, le code ci-dessous fera le travail

StringUtils.hasLength(str)
1
Avinash

Pour être complet: Si vous utilisez déjà le framework Spring, les StringUtils fournissent la méthode .

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

Résultats: true si la chaîne n'est pas nulle et a une longueur

ainsi que la méthode

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

Résultats: true si la chaîne n'est pas nulle, sa longueur est supérieure à 0 et ne contient pas uniquement d'espaces

0
l00tr

Pour vérifier si tous les attributs de chaîne d'un objet sont vides (au lieu d'utiliser! = Null pour tous les noms de champs suivant l'approche de l'API de réflexion 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;
}

Cette méthode renverrait true si toutes les valeurs du champ String sont vides. Elle renverrait false si une seule valeur est présente dans les attributs String. 

0
Lokeshkumar R

Le meilleur moyen de gérer null dans la chaîne est,

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

En bref,

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

Simplement, ignorer également les espaces:

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

Si vous utilisez le framework Spring, vous pouvez utiliser la méthode:

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

Cette méthode accepte n'importe quel objet en tant qu'argument, en la comparant à null et à la chaîne vide. En conséquence, cette méthode ne renverra jamais la valeur true pour un objet non-null non-String.

0
Taras Melnyk

J'ai rencontré une situation dans laquelle je dois vérifier que "null" (en tant que chaîne) doit être considéré comme vide. De plus, les espaces et un null doivent renvoyer la valeur true. J'ai finalement choisi la fonction suivante ...

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

Avec Java 8 Facultatif vous pouvez faire:

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

Dans cette expression, vous allez manipuler String qui contient également des espaces.

0
Stas