Когда вы создаете массив, это массив ссылки - и первоначально все эти ссылки нулевые, поэтому они не ссылаясь ни экземпляров из Dog
. Вам нужно создать экземпляр, как это:
Dog[] dogsList = new Dog[7];
dogsList[4] = new Dog();
dogsList[4].setSize(4);
В качестве альтернативы, вы можете уже иметь ссылку на Dog
от других:
Dog fido = new Dog();
// Other code here
dogsList[4] = fido;
dogsList[4].setSize(4);
Немного предыстории
Один из наиболее важные вещи для понимания - это разница между объектами и ссылки. Ссылка - это способ добраться до объекта - и несколько ссылок могут ссылаться на один и тот же объект. Например:
Dog x = new Dog();
Dog y = x;
x.setName("Fido");
System.out.println(x.getName()); // Will print "Fido"
Здесь значения x
и y
переменных не собаки ... они ссылки собакам (или нуль, которые я приду на в минуту). Линия
Dog y = x;
устанавливает начальное значение y
к значению x
- так что обе переменные относятся к одному объекту Dog
.
В настоящее время null
является специальным ссылочным значением, которое не относится к любому объекту. A NullPointerException
вызывается, если вы попытаетесь сделать dereference нулевой ссылкой (обычно с оператором .
, но также с такими вещами, как индексирование массива).
Массивы
Когда вы создаете массив, все элементы сразу заполняются значениями по умолчанию для данного типа. Для числовых типов, которые равны 0, для boolean
это значение false, а для char
это символ 0. Для любых ссылочных типов (классы) это нулевая ссылка.Так что, когда вы это делаете:
Dog[] dogsList = new Dog[7];
, что эквивалентно:
Dog[] dogsList = { null, null, null, null, null, null, null };
Таким образом, в исходном коде, значение dogsList[4]
равно нулю. Затем вы пытаетесь разыменовать эту нулевую ссылку для вызова setSize
на ссылочном объекте ... и bang! Вы получаете NullPointerException
.
В этом вопросе есть много действительно важных концепций, поэтому, пожалуйста, не стесняйтесь спрашивать больше о каких-либо конкретных точках.
Благодарим вас @Jon Skeet, ваш ответ был действительно полезен! – Hazmat