web-dev-qa-db-fra.com

Comment vérifier une chaîne contre null en java?

Comment puis-je vérifier une chaîne contre null en java? j'utilise

stringname.equalsignorecase(null)

mais ça ne marche pas.

85
user351809

string == null compare si l'objet est null. string.equals("foo") compare la valeur à l'intérieur de cet objet. string == "foo" ne fonctionne pas toujours, car vous essayez de voir si les objets sont les mêmes et non les valeurs qu'ils représentent.


Réponse plus longue:

Si vous essayez ceci, cela ne fonctionnera pas, comme vous l'avez constaté:

String foo = null;
if (foo.equals(null)) {
    // That fails every time. 
}

La raison est que foo est null, donc il ne sait pas ce que .equals est; il n'y a pas d'objet pour que .equals soit appelé.

Ce que tu voulais probablement, c'était:

String foo = null;
if (foo == null) {
    // That will work.
}

Le moyen typique de se prémunir contre un null lorsqu'il s'agit de chaînes est:

String foo = null;
String bar = "Some string";
...
if (foo != null && foo.equals(bar)) {
    // Do something here.
}

De cette façon, si foo était nul, il n'évaluait pas la seconde moitié du conditionnel, et tout allait bien.

Le moyen le plus simple, si vous utilisez un littéral String (au lieu d'une variable), est le suivant:

String foo = null;
...
if ("some String".equals(foo)) {
    // Do something here.
}

Si vous voulez contourner ce problème, Apache Commons a une classe - StringUtils - qui fournit des opérations de chaîne null-safe.

if (StringUtils.equals(foo, bar)) {
    // Do something here.
}

Une autre réponse était une blague, et a dit que vous devriez faire ceci:

boolean isNull = false;
try {
    stringname.equalsIgnoreCase(null);
} catch (NullPointerException npe) {
    isNull = true;
}

S'il vous plaît ne faites pas ça. Vous ne devriez lancer que des exceptions pour les erreurs exceptionnelles; si vous attendez un null, vous devriez le vérifier à l'avance et ne pas le laisser lever l'exception.

Dans ma tête, il y a deux raisons à cela. Premièrement, les exceptions sont lentes. la vérification contre null est rapide, mais lorsque la JVM lève une exception, cela prend beaucoup de temps. Deuxièmement, le code est beaucoup plus facile à lire et à maintenir si vous recherchez simplement le pointeur null à l’avance.

154
Dean J
s == null

ne fonctionnera pas?

28
miku

Bien sûr ça marche. Vous manquez une partie essentielle du code. Vous avez juste besoin de faire comme ça:

boolean isNull = false;
try {
    stringname.equalsIgnoreCase(null);
} catch (NullPointerException npe) {
    isNull = true;
}

;)

17
aioobe

Utilisez la méthode TextUtils.

TextUtils.isEmpty (str) : Renvoie vrai si la chaîne est nulle ou égale à 0. Paramètres: str la chaîne à examiner Retour: true si str est null ou de longueur nulle

  if(TextUtils.isEmpty(str)) {
        // str is null or lenght is 0
    }

Ci-dessous, code source de cette méthode

 /**
     * Returns true if the string is null or 0-length.
     * @param str the string to be examined
     * @return true if str is null or zero length
     */
    public static boolean isEmpty(CharSequence str) {
        if (str == null || str.length() == 0)
            return true;
        else
            return false;
    }
9
Kishan Vaghela

Si nous regardons l'implémentation de la méthode equalsIgnoreCase, nous trouvons cette partie:

if (string == null || count != string.count) {
    return false;
}

Donc, il retournera toujours false si l'argument est null. Et c'est évidemment vrai, car le seul cas où il devrait retourner true est le moment où equalsIgnoreCase a été appelé sur un null String, mais

String nullString = null;
nullString.equalsIgnoreCase(null);

entraînera certainement une exception NullPointerException.

Les méthodes equals ne sont donc pas conçues pour tester si un objet est null, simplement parce que vous ne pouvez pas les invoquer sur null.

5
Andreas_D

Cela semble un peu étrange, mais ...

stringName == null || "".equals(stringName)

Cela n'a jamais posé de problème, de plus, c'est un moyen plus sûr de vérifier tout en évitant les éventuelles exceptions de points nuls.

4
Timothy Perez

Je ne suis pas sûr de ce qui n'allait pas avec la réponse du MYYN.

if (yourString != null) {
  //do fun stuff with yourString here
}

Le chèque nul ci-dessus est tout à fait correct.

Si vous essayez de vérifier si une référence de chaîne est égale (en ignorant la casse) à une autre chaîne que vous savez n'est pas une référence nulle, procédez comme suit:

String x = "this is not a null reference"
if (x.equalsIgnoreCase(yourStringReferenceThatMightBeNull) ) {
  //do fun stuff
}

En cas de doute sur le fait de savoir si vous avez ou non des références nulles pour les deux chaînes que vous comparez, vous devez rechercher une référence nulle sur au moins l'une d'entre elles pour éviter la possibilité d'une exception NullPointerException.

3
whaley

Si votre chaîne a une valeur "null", vous pouvez utiliser

if(null == stringName){

  [code]

}

else

[Error Msg]
2
User_86

importez-le dans votre classe

import org.Apache.commons.lang.StringUtils;

puis l'utiliser, ils retourneront tous les deux

System.out.println(StringUtils.isEmpty(""));
System.out.println(StringUtils.isEmpty(null)); 
2
Khalid Habib

Vous pouvez vérifier avec String == null

Ça marche pour moi

    String foo = null;
    if(foo == null){
        System.out.println("String is null");
    }
2
Don Thomas

Méthode simple:

public static boolean isBlank(String value) {
    return (value == null || value.equals("") || value.equals("null") || value.trim().equals(""));
}
1

Naturellement, user351809, stringname.equalsignorecase(null) lancera une exception NullPointerException.
Vous voyez, vous avez un objet chaîne stringname, qui remplit 2 conditions possibles: -

  1. stringname a une valeur de chaîne non nulle (disons "ordinateur"):
    Votre code fonctionnera correctement car il prend la forme
    "computer".equalsignorecase(null)
    et vous obtenez la réponse attendue sous la forme false.
  2. stringname a une valeur null:
    Ici votre code va rester bloqué, comme
    null.equalsignorecase(null)
    Cependant, cela semble bon au premier abord et vous pouvez espérer une réponse sous la forme true,
    mais null n'est pas un objet pouvant exécuter la méthode equalsignorecase().

Par conséquent, vous obtenez l'exception en raison du cas 2.
Je vous suggère simplement d’utiliser stringname == null

1
Satyendra

Si le value renvoyé est null, utilisez:

if(value.isEmpty());

Parfois, pour vérifier null, if(value == null) en Java, il se peut que la valeur true ne soit pas donnée, même si String est null.

1
Tripathee Gaurav

Avec Java 7, vous pouvez utiliser

if (Objects.equals(foo, null)) {
    ...
}

qui retournera true si les deux paramètres sont null.

0
Roland Ettinger

Je sais que cela a été répondu il y a longtemps, mais je n'ai pas vu cela posté, alors j'ai pensé partager ce que je fais. Ce n'est pas particulièrement bon pour la lisibilité du code, mais si vous devez faire une série de vérifications nulles, j'aime bien utiliser:

String someString = someObject.getProperty() == null ? "" : someObject.getProperty().trim();

Dans cet exemple, trim est appelé sur la chaîne, ce qui jetterait un NPE si la chaîne était null ou des espaces, mais sur la même ligne, vous pouvez rechercher la valeur null ou blank afin de ne pas vous retrouver avec une tonne de (plus ) difficile à formater si les blocs.

0
Reese