2010-10-18 12 views
21

Ho una lista di String s, e voglio concatenarli con gli spazi in mezzo. Quindi sto usando StringBuilder. Ora, se uno dei numeri String è null, essi vengono memorizzati nello StringBuilder letteralmente come "null". Ecco un piccolo programma per illustrare il problema:StringBuilder append() e valori nulli

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

    String s; 
    s = null; 

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

mi aspetto l'uscita di essere "Valore:" ma si esce come "valore: null"

C'è un modo per aggirare questo problema ?

+0

cosa ti aspettavi che accada? – Blauhirn

risposta

22

Si può fare un controllo per l'oggetto prima di aggiungerlo:

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

Un punto fondamentale da fare è che null non è lo stesso un una stringa vuota. Una stringa vuota è ancora un oggetto String con i relativi metodi e campi associati, in cui un puntatore nullo non è affatto un oggetto.

Dalla documentazione per il metodo append di StringBuilder:

I caratteri dell'argomento stringa vengono aggiunti, nell'ordine, aumentando la lunghezza di questa sequenza per la lunghezza dell'argomento. Se str è null, vengono aggiunti i quattro caratteri "null".

+0

grazie per il chiarimento :), ho dimenticato di guardare in javadocs – look4chirag

0

Il controllo Null come @Shynthriir ha menzionato è il modo più semplice ed efficiente (AFAIK) per aggirare il problema.

Tuttavia, consiglio vivamente l'avvio di stringhe a una stringa vuota String str = "";, che consente di risparmiare un sacco di mal di testa in uno sforzo di programmazione più complesso.

15

io non sono sicuro perché ci si aspetta che a venire fuori vuoto, dato che il documentation è abbastanza chiaro:

Se str è nullo, quindi i quattro personaggi "null" vengono aggiunti.

Fondamentalmente è necessario non chiamare affatto append se si dispone di un riferimento null o cambiare il valore per "".

Si potrebbe scrivere un metodo per fare questa sostituzione, se vi trovate a fare un sacco:

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

Infatti, ho appena guardato la documentazione Guava e la classe Strings ha esattamente quel metodo (ma con un parametro chiamato string anziché text).

+0

Il tuo codice non verrà compilato perché "input" non è definito. :) – Sebastian

+0

@Sebastian: risolto, grazie. –

9

È possibile utilizzare commons-Lang StringUtils#defaultString():

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

Perfetto! Questo aiuta un mucchio! Mentre "null" è utile a volte, volevo solo una stringa vuota. – Brian

0

Per il mio scopo, avevo bisogno di generalizzare Risposta # 2 un po '. Ecco la stessa funzione, prendendo oggetto come argomento, invece di String:

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

In una linea che si può fare:

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

Questo non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti da un autore, lascia un commento sotto il loro post - puoi sempre commentare i tuoi post, e una volta che hai [reputazione] sufficiente (http://stackoverflow.com/help/whats-reputation) essere in grado di [commentare qualsiasi post] (http://stackoverflow.com/help/privileges/comment). –

+1

@MuhammadReda, non vedo come la mia risposta non fornisca una soluzione alla domanda. Non è una critica né un chiarimento ... quindi è per questo che non l'ho fatto per un commento ... puoi spiegarmi per favore? – robert

1

Con Java 8 si potrebbe anche utilizzare il java.util. opzionale classe per fornire un valore di default:

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