Java StringBuilder append()和空值

Java StringBuilder append()和空值,java,null,append,stringbuilder,Java,Null,Append,Stringbuilder,我有一个Strings的列表,我想在它们之间加上空格。所以我使用的是StringBuilder。现在,如果任何字符串为null,它们将以“null”的形式存储在StringBuilder中。下面是一个小程序来说明这个问题: public static void main(String ss[]) { StringBuilder sb = new StringBuilder(); String s; s = null; System.out.println(sb

我有一个
String
s的列表,我想在它们之间加上空格。所以我使用的是
StringBuilder
。现在,如果任何
字符串
null
,它们将以“null”的形式存储在
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”


有办法解决这个问题吗?

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

sb.append("Value: ");
if (s != null) sb.append(s);
System.out.println(sb);
需要指出的一个关键点是,null与空字符串不同。空字符串仍然是一个字符串对象,具有与其关联的方法和字段,其中空指针根本不是对象

从StringBuilder的append方法的文档中:

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


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


不过,我强烈建议将字符串初始化为空字符串
string str=“” 我不知道你为什么会认为它是空的,因为问题很清楚:

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

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

如果您发现自己经常这样做,您可以编写一个方法来执行此替换:

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

事实上,我刚刚查看了文档,该类正好具有该方法(但是使用了名为
string
的参数,而不是
text
)。

您可以使用commons lang的:


出于我的目的,我需要稍微概括一下答案2。 以下是相同的函数,以Object作为参数,而不是字符串:

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

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

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

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

System.out.println(sb.append(“Value:”).append(可选的.不可用的.或不可用的(“”))

使用Java内部UTIL,不需要外部LIB
toString
获取字符串,检查它是否为
null
,如果它是
null
,然后返回指定的默认值,在本例中为
(空字符串),如果它不是
null
,则返回提供的字符串。

您可以执行以下操作:

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


附加((s!=null)s:“null”)

感谢您的澄清:),我忘了研究Javadoc唯一的问题是,如果最后一行文本恰好是“空的”(例如,律师给客户的文本:史密斯先生,法院已判决您的婚姻现在为空),那么您将丢失最后一行-以及消息中最重要的单词。完美的这帮了大忙!虽然“null”有时很有用,但我真的只想要一个空字符串。这并不能回答这个问题。要评论或要求作者澄清,请在他们的帖子下方留下评论——你可以随时在自己的帖子上发表评论,一旦你有足够的评论,你就可以发表评论了。@Muhammadda,我不认为我的回答不能解决这个问题。这既不是批评也不是澄清…所以我没有把它放在评论中。。。你能解释一下你自己吗?你期望发生什么?我知道我个人认为空字符串和空字符串是一样的,因为两者在字符串中都有零个字符,并且零个字符应该附加到sb对象。我打赌警察也这么想。我并不是说这是正确的,只是说这是一个合理的答案,关于什么是预期的问题。