StringBuilder agrega null como "null"

¿Cómo?

StringBuilder sb = new StringBuilder(); sb.append("Hello"); sb.append((String)null); sb.append(" World!"); Log.d("Test", sb.toString()); 

Produce

06-25 18: 24: 24.354: D / Test (20740): ¡Mundo de Hellonull!

Espero que la adición de una cadena null no agregará en absoluto!
BTW, el molde a la String es necesario porque StringBuilder.append() tiene un montón de versiones sobrecargadas.

He simplificado mi código para hacer un punto aquí, en mi código un tiene un método de devolver una cadena

 public String getString() { ... } ... sb.append(getString()); ... 

getString() veces devuelve null ; Ahora tengo que probarlo si quiero usar un StringBuilder !!!!

Además, vamos a aclarar mi pregunta aquí: ¿cómo puedo obtener StringBuilder.append() para aceptar, de una manera elegante, una cadena nula, y no convertirlo a la cadena literal "null".
Por elegante quiero decir que no quiero obtener la cadena, prueba si es null y sólo entonces agregarlo. Estoy buscando un oneliner elegante.

Esa es la forma como es. null se agrega como "null" . Del mismo modo, cuando imprime null con System.out.println(null) se imprime "null" .

La forma de evitar que sea el método que devuelve la cadena getString() comprueba si null :

 public String getString() { ... if (result == null) { return ""; } } 
 How come? 

Está claramente escrito en documentos

Los caracteres del argumento String se añaden, en orden, aumentando la longitud de esta secuencia por la longitud del argumento. Si str es nulo, se añaden los cuatro caracteres "null".

Así que ponga un cheque nulo antes de añadir.

Se comporta así, porque null no es una String vacía como piensas en ella. Empty String sería new String(""); . Básicamente el método append() agrega "null" si obtiene valor null como parámetro.

EDITAR
Mi respuesta anterior no reflejaba la razón apropiada para tal comportamiento de StringBuilder como fue solicitado por OP. Gracias a @Stephen C por señalar que

Espero que la adición de una cadena nula no agregará en absoluto!

Pero está agregando. La razón de este comportamiento de StringBuilder se oculta en el detalle de implementación del método append(Object obj) que nos lleva al método AbstractStringBuilder#append(String str) que se define de la siguiente manera:

 public AbstractStringBuilder append(String str) { if (str == null) str = "null"; -->(1) //....... return this; } 

Se especifica claramente que si la String entrada es nula, entonces se cambia a String literal "null" y luego procesa más.

¿Cómo puedo obtener StringBuilder.append () para aceptar, de una manera elegante, una cadena nula, y no convertirlo a la cadena literal "null".

Necesita comprobar la String dada para null explícita y luego continuar. Por ejemplo:

 String s = getString(); StringBuffer buf = new StringBuffer(); //Suppose you want "Hello "<value of s>" world" buf.append("Hello "); buf.append(s==null?" world" : s+" world"); 

AbstractStringBuilder clase AbstractStringBuilder agrega un objeto a través del String.valueOf(obj) que a su vez convierte NULL en cadena literal "null". Por lo tanto no hay un método intrínseco para ayudarlo aquí. Tienes que usar el operador ternario dentro del método append o escribir un método de utilidad para manejarlo, como otros sugieren.

Esto funcionará para usted

 public static String getString(StringBuilder sb, String str) { return sb.append(str == null ? "" : str).toString(); } 

¿Qué hay de escribir un método de utilidad como

 public static void appendString(StringBuilder sb, String st) { sb.append(st == null ? "" : st); } 

O esto el operador ternario es muy práctico.

 String nullString = null; StringBuilder sb = new StringBuilder(); sb.append("Hello"); if (nullString != null) sb.append(nullString); sb.append(" World!"); Log.d("Test", sb.toString()); 

¡Ahí! Lo hice en una línea 🙂

¿Una línea?

 sb.append((getString()!=null)?getString():""); 

hecho. Pero es inútil como tener que llamar a getString() dos veces

Como se sugirió construir comprobar en el método getString()

También puede escribir decorador para StringBuilder, que puede comprobar lo que quiera:

 class NotNullStringBuilderDecorator { private StringBuilder builder; public NotNullStringBuilderDecorator() { this.builder = new StringBuilder(); } public NotNullStringBuilderDecorator append(CharSequence charSequence) { if (charSequence != null) { builder.append(charSequence); } return this; } public NotNullStringBuilderDecorator append(char c) { builder.append(c); return this; } //Other methods if you want @Override public String toString() { return builder.toString(); } } 

Ejemplo de uso:

 NotNullStringBuilderDecorator sb = new NotNullStringBuilderDecorator(); sb.append("Hello"); sb.append((String) null); sb.append(" World!"); System.out.println(sb.toString()); 

Con esta solución no tienes que cambiar las clases POJO.

  • Java.lang.ClassNotFoundException en dalvik.system.BaseDexClassLoader.findClass
  • ¿Cómo funciona una propiedad '.class'?
  • Admob no llena todo el ancho
  • El método getWindow () no está definido para el tipo AlertDialog.Builder
  • "Advertencia: no coloque las clases de contexto de Android en campos estáticos; Esto es una fuga de memoria (y también rompe el funcionamiento inmediato) "
  • ¿Se puede acceder a los valores definidos en MANIFEST.MF mediante programación?
  • Error al instalar split apks: com.android.ddmlib.InstallException: Error al finalizar la sesión: INSTALL_FAILED_INVALID_APK
  • Dalvik VM error: Excepción encontrada "Javax.xml.namespace.QName.class"
  • Cómo detectar todos los dispositivos conectados en una red WiFi desde la aplicación para Android
  • Android SQLite y enormes conjuntos de datos
  • API de Google Places para Android - PlacePikcer sin opción de búsqueda
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.