2008-09-24 23 views
6

में एक विधि कॉल के लिए एक पैरामीटर के रूप में मैं इस प्रकार की तरह एक निर्माता है:का उपयोग करते हुए 'इस' एक निर्माता

public Agent(){ 

    this.name = "John"; 
    this.id = 9; 
    this.setTopWorldAgent(this, "Top_World_Agent", true); 

} 

मैं विधि कॉल में यहाँ एक नल पॉइंटर एक्सेप्शन हो रही है। ऐसा प्रतीत होता है क्योंकि मैं setTopWorldAgent विधि में एक तर्क के रूप में 'यह' का उपयोग कर रहा हूं। इस विधि को हटाकर कॉल सबकुछ ठीक दिखाई देता है। ऐसा क्यों होता है? क्या किसी और को भी इसका अनुभव हुआ है?

+0

मुझे लगता है कि setTopWorldAgent में कोड है जहां अपवाद हो रहा है। हो सकता है कि आप अपवाद के स्टैक ट्रेस और उस विधि के कोड को जोड़ सकें। –

+0

मैं देखना चाहता हूं कि अंतिम समाधान प्रश्नकर्ता से क्या था। –

+0

इसे तर्क कहा जाता है और पैरामीटर नहीं। – Pavel

उत्तर

8

आप इसे विधियों में पास कर सकते हैं, लेकिन setTopWorldAgent() सार नहीं हो सकता है। आप कन्स्ट्रक्टर में वर्चुअल कॉल नहीं कर सकते हैं।

एक वस्तु के निर्माता में, आप उस वस्तु या आधार वर्ग में परिभाषित तरीकों कॉल कर सकते हैं, लेकिन क्योंकि व्युत्पन्न वर्ग के कुछ हिस्सों का निर्माण नहीं कर रहे हैं आप, कुछ है कि एक व्युत्पन्न वर्ग द्वारा प्रदान किया जाएगा कॉल करने के लिए उम्मीद नहीं कर सकते अभी तक। अगर setTopWorldAgent() सार था तो मैं किसी प्रकार की कंपाइलर त्रुटि की अपेक्षा करता।

जावा में, आप contructor के साथ आश्चर्य की बात व्यवहार और व्युत्पन्न वर्ग प्राप्त कर सकते हैं - यहाँ एक उदाहरण

http://en.wikipedia.org/wiki/Virtual_functions#Java_3

है आप C# या सी ++, आप इसे कॉल करने के लिए सुरक्षित है सोच सकते हैं करने के लिए उपयोग किया जाता है वर्चुअल फ़ंक्शंस और ओवरराइड वाले कॉल नहीं कर रहे हैं। जावा में, वर्चुअल कॉल तब भी बनाई जाती है जब व्युत्पन्न वर्ग पूरी तरह से निर्मित नहीं होता है।

यदि यह नहीं हो रहा है, तो संभवतया, सेटपॉपवर्ल्डएजेंट() की ज़रूरतों के सभी हिस्सों को प्रारंभ किया गया है - यदि नहीं, तो संभवतः यह उन सदस्यों में से एक है जिन्हें प्रारंभ करने की आवश्यकता है।

संपादित करें: सोचा कि यह सी #

+0

लेकिन यदि आप फ़ंक्शन कॉल करते हैं तो भी * असफल नहीं होगा! –

+0

यह उत्तर स्पष्ट रूप से गलत है। यहां तक ​​कि यदि कक्षा अमूर्त थी और विधि सेट टोपवर्ल्डएजेंट भी अमूर्त था, इस बिंदु पर सृजन के रूप में यह शून्य नहीं होगा। यह आसानी से एक टेस्टकेस के साथ दिखाया जाता है। –

+0

अरे, आप लोग इस जवाब को कम क्यों कर रहे हैं? यह सही है! –

0

this शून्य नहीं है, यह सुनिश्चित है कि बहुत कुछ है। इसे आवंटित किया गया है।

उस ने कहा, विधि में this पास करने की कोई आवश्यकता नहीं है, यह स्वचालित रूप से सभी इंस्टेंस विधियों में उपलब्ध है। यदि विधि स्थिर है, तो आप इसे एक आवृत्ति विधि में दोबारा प्रतिक्रिया दे सकते हैं।

0

था "इस" कभी नहीं अशक्त होना चाहिए। क्या आप सुनिश्चित हैं कि अपवाद को उस वजह से फेंक दिया जा रहा है?

कुछ सावधान रहना है कि यदि विधि वर्चुअल है, या किसी वर्चुअल विधियों को कॉल करता है, तो subclass के चर प्रारंभ होने से पहले उपclass से संबंधित एक विधि चलाया जा सकता है।

+0

जावा में, आप एक कन्स्ट्रक्टर में अमूर्त तरीकों को कॉल कर सकते हैं। उपclass में कार्यान्वयन विधि कहा जाएगा। – sblundy

0

त्रुटि कहीं और होनी चाहिए क्योंकि उपरोक्त कोड निश्चित रूप से काम करता है, शून्य संदर्भ कुछ और होना चाहिए।

2

setTopWorldAgent को this एक तर्क के रूप में क्यों चाहिए? आमंत्रण के आधार पर, यह एक उदाहरण विधि है, इसलिए यह पैरामीटर के रूप में प्राप्त करने की आवश्यकता के बिना this का संदर्भ दे सकता है।

1

मुझे लगता है कि इस बिंदु पर और अधिक, आप पृथ्वी पर क्यों 'इस' में एक विधि के पैरामीटर के रूप में गुजर रहे हैं?

निम्नलिखित परीक्षण करेंगे कि आप क्या कह रहे हैं और मुझे इसके साथ कोई परेशानी नहीं है।

public class Test { 
    public Test() { 
    this.hi(this); 
    } 
    public void hi(Test t) { 
    System.out.println(t); 
    } 

    public static void main(String[] args) throws Exception { 
    Test t = new Test(); 
    } 
} 
1

यह देखते हुए कि setTopWorldAgent एक उदाहरण विधि प्रतीत होता है, फिर भी आप इसे इसके माध्यम से क्यों पार कर रहे हैं?

5

उत्सुकता से, आप एक ही कक्षा के सदस्य समारोह में 'यह' क्यों पारित कर रहे हैं? setTopWorldAgent() सीधे 'इस' का उपयोग कर सकते हैं। ऐसा लगता है कि आपके कन्स्ट्रक्टर या setTopWorldAgent() स्थिर नहीं हैं, इसलिए मुझे यकीन नहीं है कि आप एक सदस्य फ़ंक्शन को क्यों पास करेंगे, जिसकी पहले से ही इसका उपयोग है।

जब तक मैं कुछ याद कर रहा हूँ ...

0

अपने एजेंट ITopWorldAgent लागू कर रहा है, तो आप वास्तव में इस करना चाहिए:

 

Agent agent = new Agent("John", 9); 
agent.setTopWorldAgent(agent, "Top_World_Agent", true); 
 

यदि नहीं, तो क्यों आप कुछ ढंग से सेट कर रहे हैं आप कर रहे हैं?

मुझे लगता है कि setTopWorldAgent विधि में कुछ ऐसा मान उपयोग कर रहा है जिसे अभी तक आपके कन्स्ट्रक्टर में प्रारंभ नहीं किया गया है।

0

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

आमतौर पर आप रचनाकारों से 'यह' पास करने से दूर हो सकते हैं जब तक कि आप वास्तव में किसी भी सदस्य या कॉल विधियों तक पहुंच नहीं पाते हैं उदाहरण के लिए यदि आप किसी अन्य वस्तु में 'इस' का संदर्भ सेट करना चाहते हैं।

इस मामले में तर्क अनावश्यक है क्योंकि इस विधि में पहले से ही 'इस' का संदर्भ है।

0

खुशी है कि आपको जवाब मिल गया है। मैं यह जोड़ना चाहता हूं कि 'इस' को पैरामीटर के रूप में पारित करने से अप्रत्याशित समवर्ती मुद्दों का कारण बन सकता है। आप मूल रूप से ऑब्जेक्ट की स्थिति को संभावित रूप से गैर-थ्रेड सुरक्षित कोड द्वारा असुरक्षित रूप से छेड़छाड़ करने की संभावना प्रदान कर रहे हैं।

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