Extraño problema con Boolean en Java 5

Un desconcertante comportamiento de Java con el autoboxing de los tipos boolean,Si tenemos las siguientes linea, funciona correctamente.

Boolean repetible=null;if(!( repetible==null))

Sin embargo, si sustituimos == por != nos encontramos con un misterioso error que provoca un “java.lang.NullPointerException at booleanValue()“.

Boolean repetible=null;if(repetible!=null)

Analizando un poco el tratamiento que le da java al autoboxing, podemos ver que el comportamiento tiene su sentido, aunque no deja de ser un tanto curioso.En el primer caso, la comparación funciona correctamente ya que el operador == aplicado a Objetos comprueba si los dos objetos son iguales, sin hacer una llamada al booleanValue() para generar el tipo primitivo.En el segundo caso al ser ambos operadores booleanos, una de las optimizaciones de la Máquina Virtual nos juega una mala pasada. En esta caso, el operador != se comporta diferente, ya que el operador de negación trabaja con el valor primitivo del Boolean, invocando a booleanValue().

Actualización

A raíz del comentario de Pablo Moretti, me he dado cuenta que estaba en un error, no es Java 5 el que tiene el problema, si no el JDT de Eclipse 3.3. Para reproducir el poblema:


    public static void main(String[] args) {
	Boolean b=null;;
	// Este código falla en Eclipse 3.3 al ejecutar en modo debug
	// un inspect sobre la condición
	if(b!=null){
	    System.out.println("B no es null");
	}
    }

Iniciamos la ejecución en modo depuración, seleccionamos con el cursor (b!=null) e inspeccionamos su valor.

Comentarios

  1. Estoy corriendo el codigo en Java 5 y no me tira el error que comentas.

    Boolean repetible=null;
    if(!( repetible!=null));

Comments are closed.