2011-01-08 12 views
9

estoy empezando con Java y estoy tratando de crear una matriz de objetos de la clase de perro y yo estoy recibiendo este error:java.lang.NullPointerException

Exception in thread "main" java.lang.NullPointerException

en esta línea:

Dog[] dogsList = new Dog[7]; 
dogsList[4].setSize(4); 

Respuesta

24

Cuando se crea una matriz, que es un conjunto de referencias - e inicialmente todas esas referencias son nulos, por lo que no se está refiriendo a cualquier casos de Dog. Es necesario crear una instancia, como esto:

Dog[] dogsList = new Dog[7]; 
dogsList[4] = new Dog(); 
dogsList[4].setSize(4); 

Alternativamente, puede que ya tenga una referencia a un Dog de otra parte:

Dog fido = new Dog(); 
// Other code here 

dogsList[4] = fido; 
dogsList[4].setSize(4); 

Un poco de historia

Una de las Lo más importante para entender es la diferencia entre objetos y referencias. Una referencia es una forma de llegar a un objeto, y múltiples referencias pueden referirse al mismo objeto. Por ejemplo:

Dog x = new Dog(); 
Dog y = x; 

x.setName("Fido"); 
System.out.println(x.getName()); // Will print "Fido" 

Aquí, los valores de las variables x y y no son perros ... son referencias a perros (o nula, lo que voy a venir a en un minuto). La línea

Dog y = x; 

establece el valor inicial de y al valor de x - por lo que las dos variables se refieren al mismo Dog objeto.

Ahora null es un valor de referencia especial que no se refiere a objeto. Se genera un NullPointerException si intenta desreferencia una referencia nula (generalmente con el operador ., pero también con elementos como la indexación de matrices).

matrices

Cuando se crea una matriz, todos los elementos están pobladas de inmediato con el valor predeterminado para el tipo. Para los tipos numéricos que son 0, para boolean es falso, y para char es el carácter 0. Para cualquier tipos de referencia (clases) es la referencia nula.Así que cuando usted hace esto:

Dog[] dogsList = new Dog[7]; 

que es equivalente a:

Dog[] dogsList = { null, null, null, null, null, null, null }; 

Así que en su código original, el valor de dogsList[4] es nulo. A continuación, intenta desreferenciar esa referencia nula para llamar al setSize en el objeto al que se hace referencia ... ¡y bang! Obtienes un NullPointerException.

Hay un montón de conceptos muy importantes que intervienen en esta cuestión, por lo que no dude en pedir más detalles sobre cualquiera de los puntos específicos.

+0

Gracias @Jon Skeet, ¡tu respuesta fue realmente útil! – Hazmat

2

Intenta llamar al setSize en null valor. Necesita crear un nuevo objeto Dog y ponerle una referencia en la celda de esta matriz.

Dog[] dogsList = new Dog[7]; 
dogList[4] = new Dog(); 
dogsList[4].setSize(4); 
3

usted haya creado una instancia de la matriz para contener los perros. No has instanciado los objetos dentro de la matriz.

Así

Dog[] dogList = new Dog[7]; 
dogList[4] = new Dog(); 
dogList[4].setSize(4); 
1

los demás puestos están en el lugar (sin doble sentido;), así que voy a dar otro enfoque para crear instancias de los objetos para perros.

Como ya se ha mencionado, el código no llena una nueva matriz con los objetos de 7 perros, sino que crea una matriz de tamaño 7, que es comienza contiene referencias nulas. Estas referencias pueden apuntar a nuevas instancias de Perro, pero no lo son hasta que lo haga manualmente.

Así, para llenar la matriz con nuevos objetos para perros (que parece ser su intención original), vamos a probar esto:

  1. crear la matriz (como ya lo hizo)
  2. Iterar a través de la matriz y crear nuevos objetos perro en cada "ranura"
  3. Acceso uno de los perros de la matriz y llamar al método setSize()

Dog[] dogsList = new Dog[7]; 

for(int i=0; i<dogsList.length; i++) { 
    dogsList[i] = new Dog(); 
} 

//will work because each slot in dogsList now points to a Dog instance 
dogsList[4].setSize(4); 

Cuestiones relacionadas