2012-09-04 13 views
8

में ऑब्जेक्ट्स प्रारंभ नहीं कर सकता है, मैं समस्या को तुरंत डुबकी दूंगा। मैं एक सीधा वर्गसरणी

class Vector{ 
    float x, y; 
} 

है और एक अन्य वर्ग अपनी सदस्य के रूप में इन वस्तुओं की एक सरणी

Vector[] buffer; 

मैं इसे इस तरह से प्रारंभ होते हैं:

buffer = new Vector[8]; 
for(Vector v: buffer) 
    v = new Vector(); 

लेकिन जब मैं पहुँच करने की कोशिश इस सरणी में इस ऑब्जेक्ट के सदस्य मुझे सीधे मेरे स्टैक ट्रेस पर एक नलपोइंटर एक्सेप्शन मिलता है। यही है, सरणी की वस्तुओं का निर्माण नहीं किया गया है। दूसरी ओर इस और अधिक परंपरागत कोड सिर्फ सही काम करता है:

buffer = new Vector[8]; 
for(int i = 0; i<8; i++) 
    buffer[i] = new Vector; 

this के रूप में चर्चा यह बताते हैं, दोनों संकलन के बाद ही होना चाहिए।

मेरा प्रश्न है, क्यों प्रत्येक लूप आइटम सरणी से वस्तुओं को प्रारंभ/निर्माण करने में विफल रहता है?

+0

यदि आप 8 को दोहराने के बजाय अपने लूप में बफर.लेथेंथ का उपयोग करते हैं तो यह हमेशा आपके सरणी के आकार के लिए सही होगा। अन्यथा यदि आप एक 8 को बदलते हैं और दूसरे को नहीं तो आप अंत तत्वों को याद करेंगे या बाध्य अपवाद से सरणी प्राप्त करेंगे। – n00begon

+0

यह सिर्फ उदाहरण के लिए था। वास्तव में लूप के लिए पहले एक चर के लिए बफर। लम्बाई आवंटित करना और स्थिति के लिए इसका उपयोग करना प्रदर्शन के लिए थोड़ा बेहतर है- लगभग नगण्य- और मेरा सम्मेलन है। – mehmetminanc

+0

वैसे भी वही अनुकूलन के बारे में एक प्रश्न भी है http://stackoverflow.com/questions/1208320/what-is-the-cost-of-calling-array-length – n00begon

उत्तर

5

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

for(int i = 0; i < buffer.length; i++){ 
    Vector v = buffer[i]; 
    v = new Vector(); 
} 

बाहर Understanding for each loop in Java मूलतः एक ही मुद्दे की जांच करें।

5

दोनों लूप के लिए एक सरणी से तत्वों तक पहुंचने के लिए समान हैं, लेकिन उन्हें प्रारंभ करने के लिए नहीं। आप इस परिदृश्य में एक के लिए-प्रत्येक पाश का उपयोग करते हैं, यह

for(int x = 0; x < array.length; x++) { 
    Vector v = array[x]; 
    v = new Vector(); 
} 

कर आप सरणी के लिए नए Vector बताए नहीं कर रहे हैं की तरह है, बजाय आप एक स्थानीय चर को यह बताए जाते हैं।

2

आपके पहले उदाहरण में, v केवल लूप के अंदर उपलब्ध है। जब आप v = new Vector(); v अद्यतन करते हैं, लेकिन बफर नहीं [i]। v बफर [i] से पहले इंगित कर रहा था, अब यह एक नए वेक्टर को इंगित करता है, buffer[i]null के रूप में बनी हुई है।