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.
Gracias @Jon Skeet, ¡tu respuesta fue realmente útil! – Hazmat