我剛開始學習Java和我試圖創建Dog類對象的數組,我得到這個錯誤:顯示java.lang.NullPointerException
Exception in thread "main" java.lang.NullPointerException
在這一行:
Dog[] dogsList = new Dog[7];
dogsList[4].setSize(4);
我剛開始學習Java和我試圖創建Dog類對象的數組,我得到這個錯誤:顯示java.lang.NullPointerException
Exception in thread "main" java.lang.NullPointerException
在這一行:
Dog[] dogsList = new Dog[7];
dogsList[4].setSize(4);
當您創建一個數組,這就是引用陣列 - 並初步所有這些引用都爲空,所以他們沒有提及任何實例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
是一個特殊的參考值,並不是指任何對象。如果您嘗試解除引用空引用(通常與.
運算符,但也與像數組索引的東西),則引發NullPointerException
。
陣列
當您創建一個數組,所有元素都被立即填充的類型的默認值。對於0的數字類型,對於boolean
它是錯誤的,對於char
它是字符0.對於任何參考類型(類),它是空引用。所以,當你這樣做:
Dog[] dogsList = new Dog[7];
這相當於:
Dog[] dogsList = { null, null, null, null, null, null, null };
因此,在你原來的代碼中,dogsList[4]
值爲null。然後嘗試解引用空引用,以便在引用的對象上調用setSize
...並且爆炸!你得到一個NullPointerException
。
在這個問題中涉及到很多非常重要的概念,所以請隨時索要任何具體問題的更多細節。
您試圖致電setSize
對null
值。您需要創建新的Dog
對象並將其引用到此數組的單元格中。
因爲第4個元素dogsList[4]
爲NULL。您需要閱讀Java中的數組。
請參考:http://download.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html並且首尾閱讀。
你已經實例化數組來保存狗。您尚未實例化數組中的對象。
所以
Dog[] dogList = new Dog[7];
dogList[4] = new Dog();
dogList[4].setSize(4);
的其他職位被點上(沒有雙關語意),所以我給你另一種方法來實例化你的狗的對象。如前所述,您的代碼不會使用7個Dog對象填充新數組,而是會創建一個大小爲7的數組,該數組的起始位置包含空引用。這些參考文獻可以將指向Dog的新實例,但直到您手動完成爲止。
所以,填補了新的狗對象的數組(這似乎是你的原意),讓我們試試這個:
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);
謝謝@Jon Skeet,你的回答真的很有幫助! – Hazmat 2017-09-30 04:04:52