2012-08-26 13 views
19

En este código.Cómo comprobar el valor nulo en java

public class Test { 
    public static void testFun(String str) { 
     if (str == null | str.length() == 0) { 
      System.out.println("String is empty"); 
     } else { 
      System.out.println("String is not empty"); 
     } 
    } 
    public static void main(String [] args) { 
     testFun(null); 
    } 
} 

Pasamos un valor nulo a la función testFun. Compila bien, pero da un nullPointerException en tiempo de ejecución.

Supongamos que el valor del argumento real que se pasa a testFun se genera a partir de algún proceso. Supongamos que erróneamente un valor nulo es devuelto por ese proceso y se alimenta a testFun. Si tal es el caso, ¿cómo azadas valida que el valor pasado a la función sea nulo o no?

Una (extraña) solución puede ser asignando el parámetro formal a alguna variable dentro de la función y luego probándola. Pero si se pasan muchas variables a la función, eso puede volverse tedioso e inviable. Entonces, ¿cómo verificar los valores nulos en tal escenario?

Editar: Por error, escribí || en lugar de | en la condición if. Ahora se genera una excepción en tiempo de ejecución

+0

favor ver la edición. – Shades88

+1

¿Olvidaste recompilar? [No produce una 'NullPointerException' para mí] (http://ideone.com/pRrB3). – oldrinb

Respuesta

38

La edición muestra exactamente la diferencia entre el código que funciona y código que no lo hace.

Esta verificación siempre se evalúa tanto de las condiciones, lanzando una excepción si str es nulo:

if (str == null | str.length() == 0) { 

Considerando que la presente (utilizando || en lugar de |) es cortocircuitar - si la primera condición evalúa a true, el segundo no se evalúa.

Ver section 15.24 del JLS para una descripción de || y section 15.22.2 para | binaria. La introducción a la sección 15.24 es el bit más importante:

El operador condicional u operador || el operador es como | (§15.22.2), pero evalúa su operando de la mano derecha solo si el valor de su operando de la mano izquierda es falso.

+4

475K! (Arco ...) – Shades88

+3

@ Shades88 869k y contando :) –

+2

@AndrasDeak Volando hacia un millón O_o – 8bitcartridge

3

El problema aquí es que en su código el programa llama a 'null.length()' que no está definido si el argumento pasado a la función es nulo. Es por eso que se lanza la excepción.

+2

Nunca llega a esa parte del 'si' si' str == null'. – Keppil

+2

en la condición if (str == null || str.length() == 0), la segunda parte nunca se evaluaría si la primera es falsa. Si quieres que se evalúe la segunda parte, la escribirías como si (str == null | str.length() == 0) para que puedas obtener un nullpointer. No veo por qué lo querría en este caso, pero en algunos casos esto podría ser beneficioso. –

+1

en realidad lo hace. || es flojo, pero usa | que evaluará ambos lados –

2

Puede utilizar StringUtils:

import org.apache.commons.lang3.StringUtils; 

if (StringUtils.isBlank(str)) { 

System.out.println("String is empty"); 

} else { 

System.out.println("String is not empty"); 

} 

un vistazo aquí también: StringUtils.isBlank() vs String.isEmpty()

isBlank ejemplos:

StringUtils.isBlank(null)  = true 
StringUtils.isBlank("")  = true 
StringUtils.isBlank(" ")  = true 
StringUtils.isBlank("bob")  = false 
StringUtils.isBlank(" bob ") = false 
Cuestiones relacionadas