StringBuilder append() and null values

谁都会走 提交于 2019-12-03 14:37:29

问题


I have a list of Strings, and I want to concatenate them with spaces in between. So I'm using StringBuilder. Now if any of the Strings are null, they get stored in the StringBuilder literally as 'null'. Here is a small program to illustrate the issue:

public static void main(String ss[]) {
    StringBuilder sb = new StringBuilder();

    String s;
    s = null;

    System.out.println(sb.append("Value: ").append(s));
}

I'd expect the output to be "Value: " but it comes out as "Value: null"

Is there a way around this problem?


回答1:


You can do a check on the object before appending it:

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

A key point to make is that null is not the same an an empty String. An empty String is still a String object with associated methods and fields associated with it, where a null pointer is not an object at all.

From the documentation for StringBuilder's append method:

The characters of the String argument are appended, in order, increasing the length of this sequence by the length of the argument. If str is null, then the four characters "null" are appended.




回答2:


I'm not sure why you'd expect it to come out empty, given that the documentation is pretty clear:

If str is null, then the four characters "null" are appended.

Basically you need to either not call append at all if you have a null reference, or switch the value for "".

You could write a method to do this substitution if you find yourself doing it a lot:

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

Indeed, I've just looked at the Guava documentation and the Strings class has exactly that method (but with a parameter called string instead of text).




回答3:


You can use commons-lang's StringUtils#defaultString():

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



回答4:


With Java 8 you could also use the java.util.Optional class to provide a default value:

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




回答5:


In one line you can do:

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



回答6:


For my purpose, I needed to generalize Answer #2 a little bit. Here is the same function, taking Object as argument, instead of String:

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



回答7:


Null check as @Shynthriir has mentioned is the simplest most efficient way (AFAIK) to get around the problem.

I would however strongly recommend initiating strings to an empty string String str = ""; instead, which would save you a lot of headache in a more complex programming effort.



来源:https://stackoverflow.com/questions/3960712/stringbuilder-append-and-null-values

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!