44 votes

StringBuilder append() et les valeurs nulles

J'ai une liste de Strings, et je veux les concaténer avec des espaces entre eux. Donc j'utilise StringBuilder. Maintenant, si l'un des Strings est null, il est stocké littéralement dans le StringBuilder comme 'null'. 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("Valeur : ").append(s));
}

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

Y a-t-il un moyen de contourner ce problème ?

35voto

Anthony Points 2461

Vous pouvez effectuer une vérification de l'objet avant de l'ajouter :

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

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

À partir de la documentation de la méthode d'ajout de StringBuilder :

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

19voto

Jon Skeet Points 692016

Je ne suis pas sûr pourquoi vous vous attendez à ce qu'il soit vide, étant donné que la documentation est assez claire :

Si str est null, alors 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 pourriez écrire une méthode pour faire cette substitution si vous vous trouvez à le faire souvent :

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

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

10voto

Sage Nadjafinia Points 101

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

sb.append("Valeur: ").append(StringUtils.defaultString(myVar));

10voto

Chris Roberts Points 73

Avec Java 8, vous pouvez également utiliser la classe java.util.Optional pour fournir une valeur par défaut :

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

4voto

robert Points 558

En une seule ligne, vous pouvez faire:

System.out.println(sb.append("Valeur: ").append((s==null)?"":s));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X