2012-01-22 63 views
5

Tôi tiếp tục nhận được một ngoại lệ tràn ngăn xếp với điều này. Tôi đã thu hẹp nó xuống lớp này để thử và tìm ra những gì đã sai nhưng tôi chỉ đơn giản là không có ý tưởng tại sao tôi tiếp tục nhận được thông báo lỗi này? Ban đầu tôi có giao diện người dùng trong một lớp khác nhưng chỉ để loại bỏ mọi thứ khác như các vấn đề trong các phương thức gọi của tôi, tôi đã chuyển các yếu tố cần thiết đến lớp này để thử và tìm ra điều gì sai. Tôi nghĩ rằng nó có thể là tài sản của tôi? Có thể nó hiển nhiên với mọi người nhưng tôi không hiểu.Ngoại lệ tràn ngăn xếp — tại sao?

Vì tôi rất mới lập trình, tôi sẽ đánh giá cao một số trợ giúp về những gì tôi đã làm sai. Từ những gì tôi hiểu vấn đề này xảy ra khi bạn có một cái gì đó giống như một vòng lặp vô hạn?

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

Tại sao bạn có mọi thứ trong một lớp đơn? – BoltClock

+0

Vì tôi đã cố gắng tìm ra điều gì sai và tôi đã chuyển những thứ cần thiết cho lớp này để thử và loại bỏ các phương pháp và thứ khác trong các lớp khác. – user1153537

+1

+1 Vì đây là ngoại lệ Stackoverflow! – DGund

Trả lời

3

Bạn đang gọi tạo đối tượng Khách hàng mới trong hàm tạo Khách hàng.

+0

Tìm tốt. Tôi cũng đang tìm kiếm sự đệ quy vô hạn. –

+0

Vấn đề là tôi muốn bắt đầu một danh sách chứa một số đối tượng và sau đó thêm Khách hàng vào danh sách này và tôi không có cách nào để lấy danh sách cập nhật với Khách hàng mới trừ khi tôi đặt chúng vào hàm tạo? – user1153537

+0

Có cách nào để thêm các Khách hàng mặc định bên trong hàm tạo và đặt các thuộc tính như Tên ở đó không? – user1153537

1

Bạn đang khởi tạo Danh sách trong hàm tạo của lớp Khách hàng của mình. Điều này sẽ gây ra một vòng lặp vô hạn và dẫn đến tràn ngăn xếp.

Tôi nghĩ bạn nên cố gắng tách mã của mình thành nhiều lớp.

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

Trong công cụ Xây dựng khách hàng, bạn gọi lại hàm tạo khách hàng, tạo lần đệ quy vô hạn.

Bạn nên có một lớp riêng biệt cho một danh sách các khách hàng và cho một khách hàng duy nhất:

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

Cảm ơn bạn rất nhiều! – user1153537

1

constructor của bạn được tự xưng (Khách hàng mới()), mà làm cho nó không bao giờ quay trở lại.

Một nguyên tắc nhỏ, nếu bạn bị tràn ngăn xếp trong C#, hãy tìm đệ quy không bao giờ chấm dứt.

+0

Có cách nào để khởi tạo danh sách khách hàng mặc định trong hàm tạo và đặt các thuộc tính như Tên cho khách hàng mặc định không? Sau đó tôi muốn để có thể thêm khách hàng vào danh sách và do đó có được danh sách để cập nhật và tôi không biết làm thế nào để làm điều này nếu tôi không khởi tạo danh sách trong constructor. – user1153537

2

Phương thức khởi tạo của bạn cho Khách hàng gọi chính nó, gây ra vòng lặp vô tận.

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

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

Cuộc gọi đệ quy vô tận đến hàm sẽ gây ra StackOverFlow.

1

Lỗi tràn ngăn xếp thường không phải từ vòng lặp vô tận, nhưng từ đệ quy vô tận (tốt, không thực sự vô tận trong thực tế, nó tiếp tục tự gọi cho đến khi ngăn xếp đầy và sau đó ngoại lệ được ném).

Nếu bạn có phương pháp sử dụng đệ quy (tức là nó tự gọi) bạn phải đảm bảo rằng điều này chỉ xảy ra một số lần giới hạn. Nếu bạn không thực hiện điều đó, bạn sẽ nhận được một phương thức gọi chính nó với một cuộc gọi phương thức tự gọi bằng một cuộc gọi phương thức tự gọi bằng một cuộc gọi phương thức tự gọi (tiếp tục quá nhiều lần này, cho đến khi ngăn xếp đầy). ... như khách hàng() gọi cho khách hàng() gọi cho khách hàng() gọi cho khách hàng() gọi khách hàng() gọi cho khách hàng() gọi cho khách hàng() gọi khách hàng() .....

Các vấn đề liên quan