2010-02-12 15 views
118

¿Puede int ser null en Java?¿Puede una int ser nula en Java?

Por ejemplo:

int data = check(Node root); 

if (data == null) { 
// do something 
} else { 
// do something 
} 

Mi objetivo es escribir una función que devuelve un int. Dicho int se almacena en la altura de un nodo, y si el nodo no está presente, será nulo, y tendré que verificarlo.

Estoy haciendo esto para la tarea, pero esta parte específica no es parte de la tarea, simplemente me ayuda a superar lo que estoy haciendo.

Gracias por los comentarios, pero parece que muy pocas personas realmente han leído lo que hay bajo el código, me preguntaba de qué otra manera puedo lograr este objetivo; fue fácil darse cuenta de que no funciona.

+1

Es error de compilación tiempo. – MayurB

Respuesta

151

int no puede ser nulo, pero Integerpuede. Debe tener cuidado al desempaquetar enteros nulos, ya que esto puede causar mucha confusión y arañazos en la cabeza.

p. Ej. esto:

int a = object.getA(); // getA returns a null Integer 

le dará una NullPointerException, a pesar de no ser objeto nulo!

Para dar seguimiento a su pregunta, si se quiere indicar la ausencia de un valor, me gustaría investigar java.util.Optional<Integer>

+1

Existen buenas razones para la existencia de la clase Entero, así que úsala cuando las necesidades sean convincentes. –

+6

@ h2g2java: Espero que no piense que poder usarlos con la colección predeterminada es convincente porque para cosas como HashMap el nivel de desperdicio es enorme y no convincente. Esta es la razón por la cual el TIntIntHashMap de Trove, usando solo primitivas, corre alrededor del círculo del HashMap no convincente. – SyntaxT3rr0r

+1

int no se puede verificar como nulo, sin embargo, puede asignar null a null en Java al convertirlo a Integer, por ejemplo, si el método check (root) puede devolver null, puede convertirlo en int haciendo algo de esta manera: 'int data = (Entero) check (nodo);' – sactiw

33

No. Solo las referencias a objetos pueden ser nulas, no primitivas.

+3

Vale la pena mencionar la clase Integer, que sería una mejor opción si el OP quiere un valor nulo. O podría usar un valor negativo para indicar "no encontrado" – Glen

+0

, entonces ¿qué haces? – user220755

+1

Use 'Integer' en su lugar. –

27

Una gran manera de averiguar:

public static void main(String args[]) { 
    int i = null; 
} 

intenta compilar.

+27

En realidad ...El OP ya lo descubrió por sí mismo según la última frase de su pregunta: * fue fácil darse cuenta de que no funciona. * – BalusC

+7

Para la posteridad casi 4 años después, ese bit se publicó en una edición posterior. –

+1

pero ... 'Entero ii = nulo; int i = ii; 'compilará pero lanzará NullPointerException en el tiempo de ejecución –

11

En Java, int es un tipo primitivo y no se considera un objeto. Solo los objetos pueden tener un valor nulo. Entonces la respuesta a su pregunta es no, no puede ser nulo. Pero no es tan simple, porque hay objetos que representan los tipos más primitivos.

La clase Entero representa un valor int, pero puede contener un valor nulo. Dependiendo de su método check, puede devolver un int o un entero.

Este comportamiento es diferente de algunos lenguajes más orientados a objetos como Ruby, donde incluso objetos "primitivos" como los objetos se consideran objetos.

5

El código ni siquiera se compilará. Solo un Object completo puede ser null, como Integer. Aquí hay un ejemplo básico para mostrar cuando se puede comprobar la nula:

Integer data = check(Node root); 

if (data == null) { 
// do something 
} else { 
// do something 
} 

Por otro lado, si check() se declara para devolver int, puede Nunca ser null y todo el if-else bloque es entonces superfluo.

int data = check(Node root); 

// do something 

problemas autoboxing no se aplica aquí también cuando se declara check() para volver int. Si hubiera devuelto Integer, entonces puede arriesgarse NullPointerException al asignarlo a int en lugar de Integer. Asignarlo como Integer y usar el bloque if-else sería obligatorio.

Para obtener más información sobre autoboxing, consulte this Sun guide.

+1

Desafortunadamente, si" check "devuelve un int en lugar de un entero, esto no ayudará, porque el int (que no será nulo) se insertará automáticamente en el Entero. –

+2

D'oh, ese fue solo un ejemplo básico para mostrar ** cuando ** puedes probar null. Por otro lado, si se declara que check devuelve 'int', nunca puede ser nulo y todo el bloque if es superfluo. – BalusC

0

Como @Glen mencionó en un comentario, usted tiene básicamente dos maneras de evitar esto:

  • uso de un "fuera de límite" valor. Por ejemplo, si los "datos" nunca pueden ser negativos en el uso normal, devuelve un valor negativo para indicar que no es válido.
  • Usa un número entero. Solo asegúrese de que el método de "verificación" devuelve un Entero, y se lo asigna a un Entero no a un int. Porque si un "int" se involucra en el camino, el boxeo y el unboxing automáticos pueden causar problemas.
1

objeto Integer sería lo mejor. Si debe usar primitivos, puede usar un valor que no existe en su caso de uso. altura negativa no existe para la gente, por lo

public int getHeight(String name){ 
    if(map.containsKey(name)){ 
     return map.get(name); 
    }else{ 
     return -1; 
    } 
} 
-14

No soy un experto, pero yo creo que la null equivalente para un int es 0.

Por ejemplo, si hace un int[], cada ranura contiene 0 a diferencia de null, a menos que lo configure para otra cosa.

En algunas situaciones, esto puede ser de utilidad.

6

Junto con toda respuesta anterior me gustaría añadir este punto también.

Para los tipos primitivos, hemos fijado la memoria es decir el tamaño de int tenemos 4 bytes y charlas que tenemos 2 bytes. Y null se usa solo para objetos porque el tamaño de la memoria no es fijo.

lo que por defecto que tenemos,

int a=0; 

y no

int a=null; 

mismo con otros tipos primitivos y, por tanto, nula sólo se utiliza para los objetos y no para los tipos primitivos.

0

comprobar NULL en su método de verificación() y devuelve un valor no válido como -1 o cero si nula. Entonces el cheque sería por ese valor en lugar de pasar el nulo. Esto sería algo normal de hacer en la 'C' anterior.

-1

Puesto que usted solicita otra manera de lograr su objetivo, le sugiero que utilice una clase contenedora:

new Integer(null). 
Cuestiones relacionadas