StringBuilder追加()和null值

我有一个String列表,我想在它们之间用空格连接它们。 所以我正在使用StringBuilder 。 现在,如果任何Stringnull ,则它们在String中存储在StringBuilder为“null”。 这是一个小程序来说明问题:

 public static void main(String ss[]) { StringBuilder sb = new StringBuilder(); String s; s = null; System.out.println(sb.append("Value: ").append(s)); } 

我希望输出为“Value:”但它出现为“Value:null”

有没有解决这个问题的方法?

您可以在追加对象之前检查对象:

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

要做的一个关键点是null与空字符串不同。 空String仍然是一个String对象,其关联的方法和字段与之关联,其中空指针根本不是对象。

从StringBuilder的append方法的文档:

String参数的字符按顺序附加,按参数的长度增加此序列的长度。 如果str为null,则附加四个字符“null”。

鉴于文档很清楚,我不确定为什么你会认为它是空的。

如果str为null,则附加四个字符“null”。

基本上,如果您有空引用,则根本不需要调用append,或者切换“”的值。

如果你发现自己做了很多事情,你可以写一个方法来做这个替换:

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

实际上,我刚刚查看了Guava文档,并且Strings类完全具有该方法(但是使用名为string而不是text的参数)。

你可以使用commons-lang的StringUtils#defaultString()

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

您可以在一行中执行以下操作:

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

使用Java 8,您还可以使用java.util.Optional类来提供默认值:

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

@Shynthriir提到的空检查是解决问题的最简单最有效的方法(AFAIK)。

但是我强烈建议将字符串初始化为空字符串String str = ""; 相反,这将在更复杂的编程工作中为您节省很多麻烦。

为了我的目的,我需要稍微概括一下答案#2。 这是相同的函数,将Object作为参数,而不是String:

 private String nullToEmpty(Object obj) { return obj == null ? "" : obj.toString(); }