2012-01-22 9 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これはStackoverflowの例外なので! – DGund

答えて

3

Customersコンストラクタで新しいCustomersオブジェクトを作成しています。

+0

Good find。私はまた、無限再帰を探していました。 –

+0

私はいくつかのオブジェクトを含むリストを開始し、後でこのリストに顧客を追加したいのですが、何らかの形でそれらをコンストラクタに設定しない限り、新しいCustomersで更新するリストを取得する方法はありません。 – user1153537

+0

コンストラクタ内にデフォルトのCustomersを追加し、そこに名前のようなプロパティを設定する方法はありますか? – 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

Customersコンストラクタでは、Customersコンストラクタを再度呼び出して、無限再帰を作成します。

あなたは顧客のリストについては、単一の顧客のために別のクラスを持っている必要があります。

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

あなたのコンストラクタは、それは決して戻らないために原因となる、(新規顧客())自分自身を呼び出しています。あなたがC#でスタックオーバーフローを取得する場合

親指の良いルールは、終了したことがない再帰を探します。

+0

コンストラクタ内のデフォルト顧客のリストを開始する方法はありますか?デフォルト顧客の名前のようなプロパティを設定しますか?後で私はリストに顧客を追加することができるようにしたいので、更新するリストを取得し、コンストラクタでリストを初期化しないと、これを行う方法がわかりません。 – user1153537

2

お客様のコンストラクタが自分自身を呼び出し、無限ループを引き起こします。関数へ

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

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

無限の再帰呼び出しはStackOverflowの原因となります。

1

スタックオーバーフローエラーが無限ループから普通ではありませんが、無限再帰から(まあ、実際には本当に無限ではない、それはスタックが満杯と例外がスローされるまで自身を呼び出し続けます)。

あなたは(すなわち、それは自分自身を呼び出す)あなたはこれが唯一の限られた回数を起こっていることを確認する必要が再帰を使用する方法を持っている場合。これをしないと、自分自身を呼び出すメソッド呼び出しで自分自身を呼び出すメソッド呼び出しで自分自身を呼び出すメソッドが得られます(スタックがいっぱいになるまで何度も何度も続けます)。 ...

関連する問題