StringBuilder append () et les valeurs null
J'ai une liste de String
s, et je veux concaténer avec des espaces entre les deux. J'utilise donc StringBuilder
. Maintenant, si tout de la String
sont 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?
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.
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
).
Vous pouvez utiliser commons-lang StringUtils#defaultString()
:
sb.append("Value: ").append(StringUtils.defaultString(myVar));
Dans une ligne, vous pouvez faire:
System.out.println(sb.append("Value: ").append((s==null)?"":s));
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("")));
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.
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();
}