¿Por qué el uso de un entero Java con valor predeterminado da como resultado una excepción NullPointerException?
-
19-09-2019 - |
Pregunta
Soy nuevo en Java.Acabo de leer que las variables de clase en Java tienen un valor predeterminado.
Probé el siguiente programa y esperaba obtener el resultado como 0
, que es el valor predeterminado en un número entero, pero obtengo el NullPointerException
.
¿Qué me estoy perdiendo?
class Test{
static Integer iVar;
public static void main(String...args) {
System.out.println(iVar.intValue());
}
}
Solución
Tiene usted razón, sin inicializar las variables de clase en Java tienen un valor por defecto asignado a ellos. Tipo Integer
en Java no son las mismas que int
. Integer
es la clase de contenedor que envuelve el valor de int
tipo primitivo en un objeto.
En su caso iVar
es una referencia a un objeto Integer
que no ha sido initiliazed. referencias sin inicializar obtener el valor por defecto de null
y cuando se intenta aplicar el método intValue
() en una referencia nula se entiende la NullPointerException
.
Para evitar este problema por completo lo que necesita para que su variable de referencia se refieren a un objeto Integer
como:
class Test {
// now iVar1 refers to an integer object which wraps int 0.
static Integer iVar1 = new Integer(0);
// uninitialized int variable iVar2 gets the default value of 0.
static int iVar2;
public static void main(String...args) {
System.out.println(iVar1.intValue()); // prints 0.
System.out.println(iVar2); // prints 0.
}
}
Otros consejos
Esto significa que iVar
es nulo. En Java, no se puede invocar métodos en una referencia nula, se genera la NullPointerException que está viendo.
private Integer amount=Integer.valueOf(0);
private Integer points=Integer.valueOf(0);
En particular, ¿por qué debería utilizar? Integer.valueOf(int)
en lugar de nuevo entero (int):Almacenamiento en caché.
Esta variante de valueOf
se agregó en JDK 5 a Byte, Short, Integer y Long (ya existía en el caso trivial en booleano desde JDK 1.4).Todos estos son, por supuesto, objetos inmutables en Java.Solía ser que si necesitabas un objeto Integer a partir de un int, construías un nuevo Integer.Pero en JDK 5+, realmente deberías usar valueOf porque Integer ahora almacena en caché objetos Integer entre -128 y 127 y puede devolverte exactamente el mismo objeto Integer(0) cada vez en lugar de desperdiciar la construcción de un objeto en un nuevo objeto Integer idéntico.