¿Por qué el uso de un entero Java con valor predeterminado da como resultado una excepción NullPointerException?

StackOverflow https://stackoverflow.com/questions/2437603

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());
    }
}
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top