StringBuilder append() 和空值

新手上路,请多包涵

我有一个 String 的列表,我想用空格将它们连接起来。所以我正在使用 StringBuilder 。现在,如果任何 Stringnull ,它们将存储在 StringBuilder 中,字面意思是“空”。下面是一个小程序来说明这个问题:

 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”

有办法解决这个问题吗?

原文由 look4chirag 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

您可以在附加对象之前对其进行检查:

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

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

来自 StringBuilder 的 append 方法的文档:

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

原文由 Anthony 发布,翻译遵循 CC BY-SA 2.5 许可协议

鉴于 文档 非常清楚,我不确定为什么你会期望它是空的:

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

基本上,如果你有一个空引用,你要么根本不调用 append,要么将值切换为“”。

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

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

实际上,我刚刚查看了 Guava 文档和 Strings 类具有完全相同的方法(但带有一个名为 string 而不是 text d 的参数)。

原文由 Jon Skeet 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题