2011-01-08 13 views
9

मैं सिर्फ जावा के साथ शुरू कर रहा हूँ और मैं कुत्ता वर्ग में ऑब्जेक्ट की श्रृंखला बनाने के लिए कोशिश कर रहा हूँ और मैं इस त्रुटि हो रही है: इस लाइन परjava.lang.NullPointerException

Exception in thread "main" java.lang.NullPointerException

:

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

उत्तर

24

जब आप एक सरणी बनाते हैं तो वह संदर्भ की एक सरणी है - और शुरू में उन सभी संदर्भों को अशक्त हैं, इसलिए वे किसी भी उदाहरणों Dog की की बात नहीं कर रहे हैं। तुम्हें पता है, एक उदाहरण बनाने की जरूरत इस तरह:

Dog fido = new Dog(); 
// Other code here 

dogsList[4] = fido; 
dogsList[4].setSize(4); 

एक छोटी सी पृष्ठभूमि

में से एक:

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

वैकल्पिक रूप से, आप पहले से ही कहीं और से कोई Dog के लिए एक संदर्भ हो सकता है समझने के लिए सबसे महत्वपूर्ण चीजें ऑब्जेक्ट्स और संदर्भ के बीच अंतर है। एक संदर्भ किसी ऑब्जेक्ट को प्राप्त करने का एक तरीका है - और एकाधिक संदर्भ एक ही ऑब्जेक्ट को संदर्भित कर सकते हैं। उदाहरण के लिए:

Dog x = new Dog(); 
Dog y = x; 

x.setName("Fido"); 
System.out.println(x.getName()); // Will print "Fido" 

यहाँ, x और y चरों के मान वे कुत्तों को संदर्भ (या अशक्त है, जो मैं एक मिनट में पर आया हूँ) कर रहे हैं कुत्तों नहीं हैं ...। लाइन

Dog y = x; 

x के मूल्य के y का प्रारंभिक मूल्य सेट - तो दो चर एक ही Dog वस्तु को देखें।

अब null एक विशेष संदर्भ मान है जो किसी भी ऑब्जेक्ट का संदर्भ नहीं देता है। NullPointerException फेंक दिया गया है यदि आप dereference एक शून्य संदर्भ (आमतौर पर . ऑपरेटर के साथ, लेकिन सरणी अनुक्रमण जैसी चीजों के साथ) का प्रयास करते हैं।

सरणी

जब आप एक सरणी बनाने के लिए, सभी तत्वों को तुरंत प्रकार के लिए डिफ़ॉल्ट मान के साथ भर जाते हैं। boolean के लिए संख्यात्मक प्रकार 0 के लिए, यह झूठा है, और char के लिए यह वर्ण 0 है। संदर्भ प्रकार (कक्षाओं) के लिए यह शून्य संदर्भ है।तो अगर आप ऐसा करते हैं जब:

Dog[] dogsList = new Dog[7]; 

कि के बराबर है:

Dog[] dogsList = { null, null, null, null, null, null, null }; 
अपने मूल कोड में

तो, dogsList[4] का मूल्य रिक्त है। फिर आप संदर्भित ऑब्जेक्ट पर setSize पर कॉल करने के लिए शून्य संदर्भ को अस्वीकार करने का प्रयास करें ... और बैंग! आपको NullPointerException मिलता है।

इस प्रश्न में बहुत सारी महत्वपूर्ण अवधारणाएं शामिल हैं, इसलिए कृपया किसी भी विशिष्ट बिंदु पर अधिक जानकारी मांगने के लिए स्वतंत्र महसूस करें।

+0

धन्यवाद @ जोन स्कीट, आपका उत्तर वास्तव में सहायक था! – 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

अन्य पदों स्पॉट पर (कोई यमक इरादा;) कर रहे हैं, इसलिए मैं आप अपने कुत्ते वस्तुओं instantiating के लिए एक और दृष्टिकोण दे देंगे।

जैसा कि पहले से ही बताया गया है, आपका कोड 7 कुत्ते ऑब्जेक्ट्स के साथ एक नई सरणी भरता नहीं है, बल्कि आकार 7 की एक सरणी बनाता है जो शून्य संदर्भों से शुरू होता है। ये संदर्भ कुत्ते के नए उदाहरणों की ओर इशारा करते हैं, लेकिन जब तक आप मैन्युअल रूप से ऐसा नहीं करते हैं तब तक नहीं होते हैं।

तो, नया कुत्ता वस्तुओं के साथ अपने सरणी (जो आपके मूल उद्देश्य प्रतीत होता है) को भरने के लिए, चलो इस कोशिश करते हैं:

  1. भर सरणी बनाएँ (के रूप में आप पहले से ही किया था)
  2. दोहराएं सरणी और प्रत्येक "स्लॉट"
  3. Access में नया कुत्ता वस्तुओं को बनाने सरणी में कुत्तों में से एक और फोन विधि 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); 

संबंधित मुद्दे