StringBuilder append () и нулевые значения - PullRequest
28 голосов
/ 18 октября 2010

У меня есть список String с, и я хочу объединить их с пробелами между ними.Поэтому я использую StringBuilder.Теперь, если какой-либо из String является 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»

Есть лиобойти эту проблему?

Ответы [ 7 ]

29 голосов
/ 18 октября 2010

Вы можете проверить объект перед его добавлением:

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

Ключевым моментом, который нужно сделать, является то, что нуль - это не то же самое, что пустая строка.Пустая строка по-прежнему является объектом String со связанными с ним методами и полями, где нулевой указатель вообще не является объектом.

Из документации по методу добавления StringBuilder:

Символы аргумента String добавляются по порядку, увеличивая длину этой последовательности на длину аргумента.Если str имеет значение null, то к нему добавляются четыре символа «null».

15 голосов
/ 18 октября 2010

Я не уверен, почему вы ожидаете, что он окажется пустым, учитывая, что документация довольно ясна:

Если str имеет значение null, тогда добавляются четыре символа "null".

Обычно вам нужно либо вообще не вызывать append, если у вас нулевая ссылка, либо переключить значение на "".

Вы можете написать метод для выполнения этой замены, если вы обнаружите, что делаете это много:

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

Действительно, я только что посмотрел документацию Guava , и класс Strings имеет именно этот метод (но с параметром, называемым string вместо text ).

9 голосов
/ 17 апреля 2013

Вы можете использовать StringUtils#defaultString():

.
sb.append("Value: ").append(StringUtils.defaultString(myVar));
3 голосов
/ 12 декабря 2016

В Java 8 вы также можете использовать класс java.util.Optional для предоставления значения по умолчанию:

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

3 голосов
/ 12 марта 2015

В одной строке вы можете сделать:

System.out.println(sb.append("Value: ").append((s==null)?"":s));
0 голосов
/ 02 сентября 2014

Для моей цели мне нужно было немного обобщить ответ №2. Вот та же функция, принимающая Object в качестве аргумента вместо String:

private String nullToEmpty(Object obj) {
    return obj == null ? "" : obj.toString();
}
0 голосов
/ 18 октября 2010

Проверка нуля, как упомянул @Shynthriir, является самым простым и эффективным способом (AFAIK), чтобы обойти проблему.

Однако я бы настоятельно рекомендовал начинать строки с пустой строки String str = "";, что избавило бы вас от головной боли при более сложном программировании.

...