2012-02-28 13 views
16

Declaro una variable booleana. Por ejemplo Boolean dataVal=null; Ahora bien, si ejecuto el siguiente segmento de código:Objeto booleano y problema de variable booleana en JAVA

if(dataVal) 
    System.out.println("\n\NULL value in dataVal: "+dataVal); 
else 
    System.out.println("\n\nvalue in dataVal: "+dataVal); 

consigo NullPointerException. Bueno, sé que es obvio, pero necesito saber el motivo detrás de esto.

+0

cuál es la razón? Su nulo es tan nullpointerException that reason –

+0

boolean = null; ? Esa es la gramática de Java incorrecta. ¿Derecha? – Russell

+3

@Russell - 'Boolean' es un objeto, no un primitivo, ergo null tiene sentido. – mcfinnigan

Respuesta

25

Al evaluar el valor booleano de un objeto Java Boolean unbox el valor (función autoboxing, ya 1.5). Entonces el código real es: dataVal.booleanValue(). Luego arroja NullPointerException. Con cualquier valor encuadrado, unboxing un objeto nulo arroja esta excepción.

Antes de 1,5 que tenía que desempacar el valor de la mano: if (dataVal.booleanValue()) por lo que fue más evidente (más detallado también :)

14

Debido dataVal está siendo fundido a boolean usando Boolean.booleanValue() cual se traduce a null.booleanValue() que le lleva a una NullPointerException.

0

if(null) no es una expresión válida, tan simple como eso.

Bajo el capó, la máquina virtual está utilizando autoboxing ... para que pueda obtener un NullPointerException.

1

booleana (clase) = booleano (tipo primitivo)!.

Java intenta obtener el valor primitivo llamando a dataVal.booleanValue(). Como dataVal es nulo, obtienes una excepción de puntero nulo.

4

Puede echar un vistazo a las especificaciones de los problemas unboxing, su situación se describe here sección 5.1.8 Contenido de la caja de conversión: Si r es nula, la conversión unboxing lanza una NullPointerException

Eso significa que su caso (/ * El objeto booleano * /) nunca se desempaquetará en un tipo primitivo booleano y, por lo tanto, arrojará un NPE porque está haciendo un if(null) no válido.

Por cierto, unboxing funcionará si tuviera:

final Boolean booleanTest = new Boolean (true); 
if (booleanTest) { 
    // Do something 
} 
Cuestiones relacionadas