¿Puede un int
estar null
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 devuelva un int
. Dicho int
está almacenado 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, solo me ayuda a superar lo que estoy haciendo.
Gracias por los comentarios, pero parece que muy pocas personas han leído realmente lo que está bajo el código, estaba preguntando cómo más puedo lograr este objetivo; fue fácil darse cuenta de que no funciona.
Respuestas:
int
no puede ser nulo, peroInteger
puede . ¡Debe tener cuidado al desempaquetar enteros nulos ya que esto puede causar mucha confusión y rascarse la cabeza!por ejemplo esto:
te dará un
NullPointerException
, a pesar de que el objeto no sea nulo!Para dar seguimiento a su pregunta, si desea indicar la ausencia de un valor, investigaría
java.util.Optional<Integer>
fuente
int data = (Integer)check(node);
int i = (Integer)null;
arrojaría NPE en tiempo de ejecución mientras lo desempaquetaba.No. Solo las referencias a objetos pueden ser nulas, no primitivas.
fuente
Una excelente manera de descubrirlo:
Intenta compilar.
fuente
Integer ii = null; int i = ii;
compilará pero lanzará NullPointerException en tiempo de ejecuciónEn 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 nula. Pero no es tan simple, porque hay objetos que representan los tipos más primitivos.
La clase Integer representa un valor int, pero puede contener un valor nulo. Dependiendo de su
check
método, podría devolver un int o un número entero.Este comportamiento es diferente de algunos lenguajes más puramente orientados a objetos como Ruby, donde incluso cosas "primitivas" como ints se consideran objetos.
fuente
Junto con toda la respuesta anterior, me gustaría agregar este punto también.
Para los tipos primitivos, tenemos un tamaño de memoria fijo, es decir, para int tenemos 4 bytes y char tenemos 2 bytes. Y nulo se usa solo para objetos porque el tamaño de la memoria no es fijo.
Entonces, por defecto tenemos,
y no
Lo mismo ocurre con otros tipos primitivos y, por lo tanto, nulo solo se usa para objetos y no para tipos primitivos.
fuente
El código ni siquiera se compilará. Solo un digno
Object
puede sernull
, comoInteger
. Aquí hay un ejemplo básico para mostrar cuándo puede probar nulo:Por otro lado, si
check()
se declara que regresaint
, nunca puede serlonull
y todo elif-else
bloque es superfluo.Los problemas de autoboxing no se aplican aquí también cuando
check()
se declara que regresaint
. Si hubiera regresadoInteger
, entonces puede arriesgarseNullPointerException
al asignarlo a un enint
lugar deInteger
. Asignarlo como unInteger
y usar elif-else
bloque habría sido obligatorio.Para obtener más información sobre autoboxing, comprobar esta guía Sun .
fuente
int
, nunca puede ser nulo y todo si el bloque es superfluo.en lugar de declarar como
int i
declararlo comoInteger i
entonces podemos haceri=null;
fuente
Objeto entero sería lo mejor. Si debe usar primitivas, puede usar un valor que no existe en su caso de uso. La altura negativa no existe para las personas, entonces
fuente
No, pero int [] puede ser.
fuente
Como @Glen mencionó en un comentario, básicamente tiene dos formas de evitar esto:
fuente
Verifique nulo en su método check () y devuelva un valor no válido como -1 o cero si es nulo. Entonces la comprobación sería para ese valor en lugar de pasar el valor nulo. Esto sería algo normal en los viejos tiempos 'C'.
fuente
Cualquier tipo de datos primitivo como int, boolean o float, etc. no puede almacenar el nulo (lateral), ya que java ha proporcionado la clase Wrapper para almacenar lo mismo como int a Integer, boolean a Boolean.
Por ejemplo: entero i = nulo;
fuente
Un int no es nulo, puede ser 0 si no se inicializa. Si desea que un entero pueda ser nulo, debe usar Integer en lugar de int. Las primitivas no tienen valor nulo. el valor predeterminado para int es 0.
Tipo de datos / valor predeterminado (para campos)
int ------------------ 0
largo ---------------- 0L
flotador ---------------- 0.0f
doble ------------- 0.0d
char --------------- '\ u0000'
Cadena --------------- nulo
booleano ------------ falso
fuente
Dado que solicita otra forma de lograr su objetivo, le sugiero que use una clase de contenedor:
fuente
No soy un experto, pero creo que el
null
equivalente para un int es0
.Por ejemplo, si crea un
int[]
, cada ranura contiene0
en lugar denull
, a menos que lo configure en otra cosa.En algunas situaciones, esto puede ser útil.
fuente