¿Podemos confiar en String.isEmpty para verificar la condición nula en una cadena en Java?

4 minutos de lectura

Estoy pasando un ID de cuenta como entrada de un archivo XML como se muestra, que se analizará más tarde y se usará en nuestro código:

<accountid>123456</accountid>
<user>pavan</user>

El problema es que si no se pasa nada (valor nulo en accoutnid) como accountid, no podría manejar esa situación en código Java. Intenté esto pero no tuve éxito:

if (acct != null||acct==""||acct.equals("")) 
{
    // the above is not working 
}

Pude manejar esto con éxito usando el siguiente enfoque:

if(!acct.isEmpty())
{
   // thisis working 
}

¿Podemos confiar en el String.isEmpty() método para comprobar la condición nula de un String? ¿Es esto válido?

avatar de usuario
jon skeet

No, absolutamente no, porque si acct es nulo, ni siquiera obtener a isEmpty… arrojará inmediatamente un NullPointerException.

Su prueba debe ser:

if (acct != null && !acct.isEmpty())

Nótese el uso de && aquí, en lugar de su || en el código anterior; también tenga en cuenta cómo en su código anterior, sus condiciones eran incorrectas de todos modos, incluso con && sólo habrías entrado en el if cuerpo si acct estaba una cadena vacía.

Alternativamente, usando Guayaba:

if (!Strings.isNullOrEmpty(acct))

  • A algunos también les gusta esta versión del mismo cheque: "".equals(acct)

    – Alex Zam

    23 de enero de 2012 a las 10:15


  • Hola Jon, probé con un programa de muestra, String str = “”; System.out.println(str.isEmpty()); , aquí devolvió verdadero , no arrojó NullPointerException . Entonces, ¿por qué no podemos usar isEmpty para verificar valores nulos? ¿Podría aclarar esto?

    usuario663724

    23 de enero de 2012 a las 11:10


  • @Kiran: Porque “” no es lo mismo que una referencia nula. Pruébalo con String str = null; y después obtendrás un NullPointerException. Es muy importante comprender la diferencia entre una referencia de cadena que es nula y una referencia de cadena que se refiere a una cadena vacía.

    – Jon Skeet

    23 de enero de 2012 a las 11:18

  • @AlexZam: Todavía querrías además comprobar si es nulo. El punto es verificar si la cadena tiene algún contenido.

    – Jon Skeet

    23 de enero de 2012 a las 11:18

  • Gracias Jon, probé con este código que me dijiste, if (acct != null && !acct.isEmpty()), pero aún así no puedo manejarlo cuando no se pasa un ID de cuenta.

    usuario663724

    23 de enero de 2012 a las 11:32

avatar de usuario
iradacher

Usar StringUtils.isEmpty en su lugar, también buscará nulos.

Los ejemplos son:

 StringUtils.isEmpty(null)      = true
 StringUtils.isEmpty("")        = true
 StringUtils.isEmpty(" ")       = false
 StringUtils.isEmpty("bob")     = false
 StringUtils.isEmpty("  bob  ") = false

Ver más en Documentación oficial sobre String Utils.

  • Las respuestas de solo enlace deben publicarse como comentarios en su lugar

    – NSNoob

    04/02/2016 a las 12:35

  • pero por lo tanto necesito más reputación

    – lradacher

    16 de agosto de 2016 a las 11:15

avatar de usuario
vaandú

no puedes usar String.isEmpty() si es nulo. Lo mejor es tener su propio método para verificar nulo o vacío.

public static boolean isBlankOrNull(String str) {
    return (str == null || "".equals(str.trim()));
}

  • Recomendaría usar StringUtils de commons-lang en lugar de escribir uno propio.

    – Vadim

    23 de enero de 2012 a las 10:15

  • +1 lo haría no recomendamos agregar commons-lang a su proyecto (a menos que ya lo esté incluyendo) solo para un método tan simple.

    – leonbloy

    4 de febrero de 2016 a las 12:24


  • Leyendo las respuestas anteriores, ¿qué tal str == null || str.trim().isEmpty()?

    – IG Pascual

    27/09/2016 a las 13:59

  • @ardila que es exactamente lo que está comprobando esta respuesta

    – IG Pascual

    6 de julio de 2017 a las 9:45

no, el String.isEmpty() método se ve como sigue:

public boolean isEmpty() {
    return this.value.length == 0;
}

como puede ver, verifica la longitud de la cadena, por lo que definitivamente debe verificar si la cadena es nula antes.

Creo que la respuesta aún más corta que te gustará es:
StringUtils.isBlank(cuenta);

De la documentación:
http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/StringUtils.html#isBlank%28java.lang.String%29

isBlank
public static boolean isBlank(String str)
Checks if a String is whitespace, empty ("") or null.

 StringUtils.isBlank(null)      = true
 StringUtils.isBlank("")        = true
 StringUtils.isBlank(" ")       = true
 StringUtils.isBlank("bob")     = false
 StringUtils.isBlank("  bob  ") = false
 
Parameters:
str - the String to check, may be null
Returns:
true if the String is null, empty or whitespace

avatar de usuario
nsnoob

String s1=""; // empty string assigned to s1 , s1 has length 0, it holds a value of no length string

String s2=null; // absolutely nothing, it holds no value, you are not assigning any value to s2

entonces nulo no es lo mismo que vacío.

¡¡¡Espero que ayude!!!

¿Ha sido útil esta solución?