2010-10-18 1 views
21

У меня есть список String s, и я хочу объединить их между пробелами. Поэтому я использую StringBuilder. Теперь, если какой-либо из String s равен null, они сохраняются в StringBuilder буквально как «null». Вот небольшая программа для иллюстрации проблемы:StringBuilder append() и 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: нуль»

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

+0

что вы ожидаете произойдет? – Blauhirn

ответ

22

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

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

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

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

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

+0

спасибо за разъяснение :), я забыл заглянуть в javadocs – look4chirag

0

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

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

15

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

Если строка равна нулю, то четыре символа «нуль» прилагаются.

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

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

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

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

+0

Ваш код не будет компилироваться, потому что «ввод» не определен. :) – Sebastian

+0

@Sebastian: Исправлено, спасибо. –

9

Вы можете использовать обыкновенные-Ланг StringUtils#defaultString():

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

Отлично! Это помогает кучу! Хотя «null» иногда бывает полезно, я действительно хотел только пустую строку. – Brian

0

Для моей цели, мне нужно обобщать Ответ # 2 немного. Вот та же функция, принимая объект в качестве аргумента, вместо строки:

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

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

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

Это не дает ответа на вопрос. Чтобы критиковать или запросить разъяснения у автора, оставьте комментарий ниже своего сообщения - вы всегда можете прокомментировать свои собственные сообщения, и как только у вас будет достаточно [репутации] (http://stackoverflow.com/help/whats-reputation), вы будете быть в состоянии [прокомментировать любое сообщение] (http://stackoverflow.com/help/privileges/comment). –

+1

@MuhammadReda, я не вижу, как мой ответ не дает решения вопроса. Это не критика, ни разъяснение ... поэтому я не надел ее комментарием ... не могли бы вы объяснить сами? – robert

1

С Java 8 можно также использовать java.util. Дополнительный класс, чтобы обеспечить значение по умолчанию:

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