2011-01-08 112 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" 

這裏,xy變量的值是不是狗...他們引用狗(或空,我就來上一分鐘)。行

Dog y = x; 

設置的y到的x值的初始值 - 這樣的兩個變量是指相同的Dog對象。

現在null是一個特殊的參考值,並不是指任何對象。如果您嘗試解除引用空引用(通常與.運算符,但也與像數組索引的東西),則引發NullPointerException

陣列

當您創建一個數組,所有元素都被立即填充的類型的默認值。對於0的數字類型,對於boolean它是錯誤的,對於char它是字符0.對於任何參考類型(類),它是空引用。所以,當你這樣做:

Dog[] dogsList = new Dog[7]; 

這相當於:

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

因此,在你原來的代碼中,dogsList[4]值爲null。然後嘗試解引用空引用,以便在引用的對象上調用setSize ...並且爆炸!你得到一個NullPointerException

在這個問題中涉及到很多非常重要的概念,所以請隨時索要任何具體問題的更多細節。

+0

謝謝@Jon Skeet,你的回答真的很有幫助! – Hazmat 2017-09-30 04:04:52

2

您試圖致電setSizenull值。您需要創建新的Dog對象並將其引用到此數組的單元格中。

3

你已經實例化數組來保存狗。您尚未實例化數組中的對象。

所以

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

的其他職位被點上(沒有雙關語意),所以我給你另一種方法來實例化你的狗的對象。如前所述,您的代碼不會使用7個Dog對象填充新數組,而是會創建一個大小爲7的數組,該數組的起始位置包含空引用。這些參考文獻可以將指向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); 

相關問題