2012-01-22 12 views
5

मुझे इसके साथ एक स्टैक ओवरफ़्लो अपवाद मिल रहा है। मैंने इसे गलत तरीके से समझने और समझने के लिए इस वर्ग में संकुचित कर दिया है, लेकिन मुझे नहीं पता कि मुझे यह त्रुटि संदेश क्यों मिल रहा है? मूल रूप से मेरे पास एक और कक्षा में उपयोगकर्ता इंटरफ़ेस है, लेकिन मेरी कॉलिंग विधियों में समस्याओं जैसी अन्य सभी चीजों को खत्म करने के लिए मैंने इस वर्ग में आवश्यक चीज़ों को हल करने और समझने के लिए आवश्यक किया। मैंने सोचा कि यह मेरी संपत्ति हो सकती है? शायद यह सबके लिए स्पष्ट है लेकिन मैं बस समझ में नहीं आता।ढेर ओवरफ्लो अपवाद- क्यों?

चूंकि मैं प्रोग्रामिंग के लिए बहुत नया हूं, इसलिए मैंने जो कुछ गलत किया है उस पर कुछ मदद की सराहना करता हूं। क्या मैं समझता हूं कि यह समस्या तब होती है जब आपके पास अनंत लूप की तरह कुछ होता है?

namespace MyNameSpace 
{ 
    public class Customers 
    { 
     private List<Customers> customers; 

     public Customers() 
     { 
      customers = new List<Customers>(); 

      AddCustomer(new Customers() 
      { 
      Name = "A", Telephone="1" 
      }); 
     } 

     public string Name 
     { 
      get; 
      set; 
     } 
     public string Telephone 
     { 
      get; 
      set; 
     } 

     public void RunTest() 
     { 

      Console.WriteLine(); 
      Console.WriteLine("****** VIDEOSTORE ******"); 
      Console.WriteLine(); 
      Console.WriteLine("1. Show Customers"); 
      Console.WriteLine("6. Quit"); 

      string userChoice = Console.ReadLine(); 

      switch (userChoice) 
      { 
       case "1": 
        View(); 
        break;   

        break; 
       case "2": 
        break; 
      } 
     } 

     public void View() 
     { 
      foreach (Customers c in customers) 
      { 
       Console.WriteLine(); 
       Console.WriteLine(c.Name); 
       Console.WriteLine(c.Telephone); 
       Console.WriteLine(); 
      } 
     } 

     public void AddCustomer(Customers custom)       
     { 
      customers.Add(custom);   
     } 
    } 
} 
+0

आपके पास सबकुछ क्यों है एकल वर्ग? – BoltClock

+0

क्योंकि मैंने यह पता लगाने की कोशिश की कि क्या गलत था और मैंने अन्य वर्गों में अन्य विधियों और चीजों को आजमाने और समाप्त करने के लिए आवश्यक वर्गों को इस वर्ग में स्थानांतरित कर दिया। – user1153537

+1

+1 क्योंकि यह एक स्टैक ओवरफ्लो अपवाद है! – DGund

उत्तर

3

आप ग्राहक निर्माणकर्ता में अपनी नई ग्राहक वस्तु बनाने के लिए बुला रहे हैं।

+0

अच्छा खोज। मैं अनंत रिकर्सन की भी तलाश कर रहा था। –

+0

बात यह है कि मैं कई ऑब्जेक्ट्स वाली एक सूची शुरू करना चाहता हूं और बाद में ग्राहकों को इस सूची में जोड़ना चाहता हूं और मुझे नहीं पता कि नए ग्राहकों के साथ सूची को कैसे अपडेट किया जाए, जब तक कि मैं उन्हें किसी भी तरह से निर्माता में सेट नहीं करता? – user1153537

+0

क्या कन्स्ट्रक्टर के अंदर डिफ़ॉल्ट ग्राहक जोड़ने का कोई तरीका है और वहां नाम जैसे गुण सेट करें? – user1153537

1

आप अपने ग्राहक वर्ग के निर्माता के भीतर एक सूची को तत्काल कर रहे हैं। यह एक अनंत लूप का कारण बन जाएगा और परिणाम एक ढेर ओवरफ्लो में होगा।

मुझे लगता है कि आपको अपने कोड को कई कक्षाओं में अलग करने का प्रयास करना चाहिए।

public class Customer 
{ 
    public string Name { get; set; } 
    public string Telephone { get; set; } 
} 

public class Program 
{ 
    private List<Customer> _customers = new List<Customer(); 

    public Program() 
    { 
     _customers.Add(new Customer() 
     { 
      Name = "A", Telephone="1" 
     }); 
    } 

    // your other methods here - like View() 
} 
7

ग्राहक कन्स्ट्रक्टर में आप ग्राहक कन्स्ट्रक्टर को फिर से कॉल करते हैं, अनंत रिकर्सन बनाते हैं।

आप ग्राहकों की एक सूची के लिए और एक ही ग्राहक के लिए एक अलग वर्ग होना चाहिए:

namespace MyNameSpace 
{ 
    public class Customer 
    { 
     public string Name 
     { 
      get; 
      set; 
     } 
     public string Telephone 
     { 
      get; 
      set; 
     } 
    } 

    public class Customers 
    { 
     private List<Customer> customers; 

     public Customers() 
     { 
      customers = new List<Customer>(); 

      AddCustomer(new Customer() 
      { 
      Name = "A", Telephone="1" 
      }); 
     } 


     public void RunTest() 
     { 

      Console.WriteLine(); 
      Console.WriteLine("****** VIDEOSTORE ******"); 
      Console.WriteLine(); 
      Console.WriteLine("1. Show Customers"); 
      Console.WriteLine("6. Quit"); 

      string userChoice = Console.ReadLine(); 

      switch (userChoice) 
      { 
       case "1": 
        View(); 
        break;   

        break; 
       case "2": 
        break; 
      } 
     } 

     public void View() 
     { 
      foreach (Customer c in customers) 
      { 
       Console.WriteLine(); 
       Console.WriteLine(c.Name); 
       Console.WriteLine(c.Telephone); 
       Console.WriteLine(); 
      } 
     } 

     public void AddCustomer(Customer customer)       
     { 
      customers.Add(customer);   
     } 
    } 
} 
+0

बहुत बहुत धन्यवाद! – user1153537

1

आपका निर्माता ही बुला रहा है (नई ग्राहकों()), जिसकी वजह से यह कभी नहीं लौटने के लिए।

अंगूठे का एक अच्छा नियम, यदि आपको सी # में स्टैक ओवरफ़्लो मिलता है, तो रिकर्सन की तलाश करें जो कभी समाप्त नहीं होती है।

+0

क्या कंस्ट्रक्टर में डिफ़ॉल्ट ग्राहकों की सूची शुरू करने का कोई तरीका है और डिफ़ॉल्ट ग्राहकों के लिए नाम जैसे गुण सेट करें? बाद में मैं ग्राहकों को सूची में जोड़ने में सक्षम होना चाहता हूं और इस प्रकार सूची को अपडेट करने में सक्षम होना चाहता हूं और मुझे नहीं पता कि अगर मैं कन्स्ट्रक्टर में सूची को प्रारंभ नहीं करता हूं तो यह कैसे करें। – user1153537

2

ग्राहकों के लिए आपका कन्स्ट्रक्टर स्वयं को कॉल करता है, जिससे अंतहीन पाश होता है।

public Customers() 
{ 
    customers = new List<Customers>(); 

    AddCustomer(new Customers() // <- Here 
    { 
    Name = "A", Telephone="1" 
    }); 
} 

फ़ंक्शन में अंतहीन रिकर्सिव कॉल स्टैक ओवर फ़्लो का कारण बनेंगे।

1

स्टैक ओवरफ़्लो त्रुटियां आमतौर पर अंतहीन लूप से नहीं होती हैं, लेकिन अंतहीन पुनरावृत्ति से (अच्छी तरह से, अभ्यास में वास्तव में अंतहीन नहीं है, यह स्टैक पूर्ण होने तक स्वयं को कॉल करना जारी रखता है और फिर अपवाद फेंक दिया जाता है)।

यदि आपके पास एक विधि है जो रिकर्सन का उपयोग करती है (यानी यह स्वयं को कॉल करती है) तो आपको यह सुनिश्चित करना होगा कि यह केवल सीमित संख्या में होता है। यदि आप ऐसा नहीं करते हैं, तो आपको एक विधि मिलती है जो स्वयं को एक विधि कॉल के साथ कॉल करती है जो स्वयं को एक विधि कॉल के साथ कॉल करती है जो स्वयं को कॉल करने वाली विधि कॉल के साथ कॉल करती है (स्टैक पूर्ण होने तक इसे कई बार जारी रखें)। ... ग्राहकों को कॉल करना() ग्राहकों को कॉल करना() ग्राहकों को कॉल करना() ग्राहकों को कॉल करना() ग्राहकों को कॉल करना() ग्राहकों को कॉल करना() ग्राहकों को कॉल करना() ग्राहकों को कॉल करना() .....

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