Подтвердить что ты не робот

StringBuilder append() и нулевые значения

У меня есть список String s, и я хочу объединить их между пробелами. Поэтому я использую StringBuilder. Теперь, если любой из String равен null, они сохраняются в StringBuilder буквально как "null". Вот небольшая программа, иллюстрирующая проблему:

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"

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

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