2011-01-08 4 views
9

Я только начинаю с Java, и я пытаюсь создать массив объектов класса Dog, и я получаю эту ошибку:java.lang.NullPointerException

Exception in thread "main" java.lang.NullPointerException

на этой линии:

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

ответ

24

Когда вы создаете массив, это массив ссылки - и первоначально все эти ссылки нулевые, поэтому они не ссылаясь ни экземпляров из 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.

В этом вопросе есть много действительно важных концепций, поэтому, пожалуйста, не стесняйтесь спрашивать больше о каких-либо конкретных точках.

+0

Благодарим вас @Jon Skeet, ваш ответ был действительно полезен! – Hazmat

2

Вы пытаетесь позвонить в setSize по телефону null. Вам нужно создать новый объект Dog и поместить ссылку на него в ячейке этого массива.

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

Вы создали экземпляр массива для размещения собак. Вы не создали объекты в массиве.

Так

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

Другие посты спот-(не каламбур;), так что я дам вам еще один подход к инстанцированию ваших объектов собаки.

Как уже упоминалось, ваш код не заполняет новый массив 7 объектами Dog, а создает массив размером 7, который начинается с нулевых ссылок. В этих ссылках можно указать на новые экземпляры Dog, но пока вы не сделаете это вручную.

Таким образом, чтобы пополнить свой массив новых объектов Dog (который, кажется, быть ваше изначальное намерение), давайте попробуем это:

  1. Создать массив (как вы уже делали)
  2. итерации поперек массив и создать новые объекты Собаки в каждом «слоте»
  3. доступ одна из собака в массиве и вызвать метод 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);