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"
Есть ли способ решить эту проблему?
Ответы
Ответ 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();
}