StringBuilder append () et les valeurs null

J'ai une liste de Strings, et je veux concaténer avec des espaces entre les deux. J'utilise donc StringBuilder. Maintenant, si tout de la Stringsont null, ils sont stockés dans la StringBuilder littéralement comme "nulle". Voici un petit programme pour illustrer le problème:

public static void main(String ss[]) {
    StringBuilder sb = new StringBuilder();

    String s;
    s = null;

    System.out.println(sb.append("Value: ").append(s));
}

Je m'attendrais à ce que la sortie soit "Value:" mais elle sort comme "Value: null"

Est-il un moyen de contourner ce problème?

23
demandé sur Pops 2010-10-18 19:33:44

7 réponses

, Vous pouvez faire une vérification sur l'objet avant d'ajouter:

sb.append("Value: ");
if (s != null) sb.append(s);
System.out.println(sb);

Un point clé à faire est que null n'est pas le même une chaîne vide. Une chaîne vide est toujours un objet String avec des méthodes associées et des champs associés, où un pointeur null n'est pas du tout un objet.

Dans la documentation de la méthode append de StringBuilder:

Les caractères de L'argument String sont ajoutés, dans l'ordre, augmentant la longueur de cette séquence par la longueur de argument. Si str est null, les quatre caractères "null" sont ajoutés.

25
répondu Anthony 2010-10-18 15:44:17

Je ne sais pas pourquoi vous vous attendez à ce qu'il sorte vide, étant donné que la documentation est assez claire:

Si str est null, les quatre caractères "null" sont ajoutés.

Fondamentalement, vous devez soit ne pas appeler append du tout si vous avez une référence nulle, soit changer la valeur pour"".

Vous pouvez écrire une méthode pour faire cette substitution si vous vous trouvez le faire beaucoup:

public static String nullToEmpty(String text) {
    return text == null ? "" : text;
}

En effet, je viens de regarder le Goyave de la documentation et de la Strings classe a exactement cette méthode (mais avec un paramètre appelé string au lieu de text).

15
répondu Jon Skeet 2013-04-12 07:53:33

Vous pouvez utiliser commons-lang StringUtils#defaultString():

sb.append("Value: ").append(StringUtils.defaultString(myVar));
9
répondu Sage Nadjafinia 2014-02-07 20:19:29

Dans une ligne, vous pouvez faire:

System.out.println(sb.append("Value: ").append((s==null)?"":s));
3
répondu robert 2015-03-12 19:45:45

Avec Java 8, Vous pouvez également utiliser le java.util.Optionnel classe pour fournir une valeur par défaut:

System.out.println(sb.append("Value: ").append(Optional.ofNullable(s).orElse("")));

2
répondu Chris Roberts 2016-12-12 15:57:32

Null check comme @ Shynthriir l'a mentionné est le moyen le plus simple et le plus efficace (AFAIK) pour contourner le problème.

Je recommande cependant fortement d'initier des chaînes à une chaîne vide String str = ""; à la place, ce qui vous éviterait beaucoup de maux de tête dans un effort de programmation plus complexe.

0
répondu posdef 2010-10-18 15:39:09

Pour mon but, j'avais besoin de généraliser un peu la réponse # 2. Voici la même fonction, prenant Object comme argument, au lieu de String:

private String nullToEmpty(Object obj) {
    return obj == null ? "" : obj.toString();
}
0
répondu dokaspar 2014-09-02 15:16:18