StringBuilder将null附加为“null”

时间:2013-06-26 08:55:58

标签: java android stringbuilder

怎么回事?

    StringBuilder sb = new StringBuilder();

    sb.append("Hello");
    sb.append((String)null);
    sb.append(" World!");
    Log.d("Test", sb.toString());

可生产

  

06-25 18:24:24.354:D / Test(20740): Hellonull World!

我希望追加null字符串根本不会附加!!
顺便说一下,转换为String是必要的,因为StringBuilder.append()有很多重载版本。

我简化了我的代码,在这里提出了一个观点,在我的代码中有一个方法返回一个字符串

public String getString() { ... }
...
sb.append(getString());
...

getString()有时会返回null;现在我必须测试它,如果我想使用StringBuilder !!!!

此外,让我们在这里澄清我的问题:如何让StringBuilder.append()以优雅的方式接受空字符串,而不是将其转换为文字字符串“null”。
优雅我的意思是我不想得到字符串,测试它是null然后才附加它。我正在寻找一个优雅的oneliner。

10 个答案:

答案 0 :(得分:5)

How come?

clearly written in docs

  

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

所以请在追加之前进行空检查。

答案 1 :(得分:4)

就是这样。 null附加为"null"。同样,当您使用null打印System.out.println(null)时,您会打印"null"

避免这种情况的方法是返回字符串getString()的方法检查null

public String getString() {
    ...
    if (result == null) {
        return "";
    }
}

答案 2 :(得分:2)

它的行为与此类似,因为null不是您想象的空String。空String将为new String("");。基本上append()方法会在"null"值作为参数时附加null

答案 3 :(得分:2)

修改
我的previous answer没有反映出OP提出的StringBuilder这种行为的正当理由。感谢@Stephen C指出

  

我希望附加一个空字符串根本不会附加!!

但它正在追加。 StringBuilder这种行为的原因隐藏在append(Object obj)方法的实现细节中,该方法将我们带到AbstractStringBuilder#append(String str)方法,该方法定义如下:

public AbstractStringBuilder append(String str) {
    if (str == null) str = "null"; -->(1)
    //.......
    return this;
}

它明确指出如果输入String为null,则将其更改为String literal“null”,然后进一步处理。

  

如何让StringBuilder.append()以优雅的方式接受空字符串,而不是将其转换为文字字符串“null”。

您需要明确检查String的{​​{1}},然后继续。例如:

null

答案 4 :(得分:1)

AbstractStringBuilder类通过String.valueOf(obj)方法追加一个对象,该方法又将NULL转换为字符串文字“null”。因此,没有内置的方法来帮助你。您必须在append方法中使用三元运算符或者编写实用程序方法来处理它,正如其他人所建议的那样。

答案 5 :(得分:1)

这对你有用

public static String getString(StringBuilder sb, String str) {
    return sb.append(str == null ? "" : str).toString();
}

答案 6 :(得分:0)

如何编写像

这样的实用方法
public static void appendString(StringBuilder sb, String st) {
    sb.append(st == null ? "" : st);
}

或者这个三元运算符非常方便。

答案 7 :(得分:0)

String nullString = null;
StringBuilder sb = new StringBuilder();
sb.append("Hello");
if (nullString != null) sb.append(nullString);
sb.append(" World!");
Log.d("Test", sb.toString());

有!我在一行中做到了:)

答案 8 :(得分:0)

一行?

sb.append((getString()!=null)?getString():"");

完成。但是,无需拨打getString()两次

,这是毫无意义的

建议检查getString()方法

答案 9 :(得分:0)

您还可以为StringBuilder编写装饰器,它可以检查您想要的任何内容:

class NotNullStringBuilderDecorator {

    private StringBuilder builder;

    public NotNullStringBuilderDecorator() {
        this.builder = new StringBuilder();
    }

    public NotNullStringBuilderDecorator append(CharSequence charSequence) {
        if (charSequence != null) {
            builder.append(charSequence);
        }

        return this;
    }

    public NotNullStringBuilderDecorator append(char c) {
        builder.append(c);

        return this;
    }

    //Other methods if you want

    @Override
    public String toString() {
        return builder.toString();
    }
}

使用示例:

NotNullStringBuilderDecorator sb = new NotNullStringBuilderDecorator();
sb.append("Hello");
sb.append((String) null);
sb.append(" World!");

System.out.println(sb.toString());

使用此解决方案,您无需更改POJO类。