2010-07-21 22 views
6

Khi tôi cố gắng tạo một đối tượng của lớp form trong lớp form, nó cho một ngoại lệ như stackoverflow occured.However, khi tôi khai báo đối tượng của form class trong một method, nó hoạt động tốt. mã này là như sau:exceptionoverflow exception trong form class

namespace WindowsFormsApplication6 
{ 
    public partial class Form1 : Form 
    { 

     **Form1 f1 = new Form1();**//gives stackoverflow exception....... 

     char[] ar = new char[15]; 
     int flag = 0, end; 
     double val1, val2, res; 
     string oprt; 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void masters(object sender, EventArgs e) 
     { 
      ar[i] = char.Parse(((Button)sender).Text); 
      if (char.IsDigit(ar[i])) 
      { 
       if (flag != 0) 
       { 
        if (textBox1.Text == oprt) 
        { 
         textBox1.Clear(); 
        } 

       } 
       else 
       { 
        if (end == 1) 
        { 
         textBox1.Clear(); 
         end = 0; 
        } 
       } 
       Button ansbox = sender as Button; 
       textBox1.Text += ansbox.Text; 

      } 
      else if (char.IsSymbol(ar[i])) 
      { 
       if (textBox1.TextLength != 0) 
       { 
        val1 = double.Parse(textBox1.Text); 
        textBox1.Clear(); 
        Button bt = sender as Button; 
        if (bt != null) 
         textBox1.Text = bt.Text; 
        oprt = bt.Text; 
        // dot.Enabled = true; 
        flag = 1; 
       } 
      } 
     } 





     private void button14_Click(object sender, EventArgs e) 
     { 
      if (textBox1.TextLength != 0) 
      { 
       val2 = double.Parse(textBox1.Text); 
       switch (oprt) 
       { 
        case "+": res = val1 + val2; 
         break; 
        case "-": res = val1 - val2; 
         break; 
        case "*": res = val1 * val2; 
         break; 
        case "/": res = val1/val2; 
         break; 
       } 


       textBox1.Text = res.ToString(); 
       flag = 0; 
       end = 1; 
      } 
     } 
    } 
} 

} 
+7

+1 ngoại lệ ngăn xếp! – Fabian

Trả lời

4

bạn đang tạo một thể hiện riêng của Form1 khi Form1 được tạo ra vì vậy đây là loại một vòng lặp vô tận:

một nơi nào đó trong mã của bạn bạn tạo dụ Form1 đầu tiên của bạn. Khi trường hợp này đang tạo, nó tạo ra một thể hiện mới của Form1. dụ này cũng tạo ra một thể hiện của Form1 và một lần nữa, và một lần nữa, vv

Vì vậy, khi một thể hiện được tạo ra tất cả các biến được khởi tạo và khi bạn khai báo như thế này: Form1 f1 = new Form1() này automaticly instatiates một trường hợp mới của biểu mẫu.

Tôi đề nghị bạn không có một trường hợp mới của Form1 của bạn bên trong Form1 của bạn, nhưng nếu bạn thực sự cần điều này tạo ra một phương pháp để làm cho dụ:

Thay đổi Form1 f1 = new Form1(); vào Form1 f1;. Và tạo phương thức:

public void InstantiateNewForm1Instance() 
{ 
    f1 = new Form1(); 
} 

Nhưng: KHÔNG GỌI PHƯƠNG PHÁP NÀY TRONG BỘ XÂY DỰNG! Nếu không, bạn sẽ có cùng một vấn đề :-)

1

Biểu mẫu được khởi tạo, sau đó nó xử lý các trường riêng, tức là biểu mẫu1, sau đó khởi tạo trường riêng (tìm biểu mẫu 1), sau đó khởi tạo đối tượng và quy trình đó các trường riêng tư, tiếp tục.

Vì vậy, đó là lý do tại sao điều đó xảy ra, trong khi, trong một phương pháp, một phương pháp chỉ thực hiện khi được gọi, không khởi tạo nội bộ.

Tại sao, khi ở trong biểu mẫu 1, bạn có cần một phiên bản khác của cùng một biểu mẫu không?

+2

Erm ... insanity? – Lazarus

2

Đó là bởi vì mỗi khi bạn tạo một thể hiện của lớp học của bạn, nó tạo ra một thể hiện của lớp học của bạn và vân vân ... và vân vân ... và vân vân ...

Nói cách khác, bạn có một đệ quy vô hạn khi bạn cố tạo một thể hiện của lớp của bạn.

Bạn cần phải thêm một số loại kiểm soát xung quanh việc có hay không một phiên bản mới của Form1 được tạo tại thời điểm xây dựng. Một giải pháp đơn giản (và không hoàn chỉnh) sẽ giống như sau:

public partial class Form1 : Form 
{ 
    Form1 f1; 

    public Form1() : this(false) 

    public Form1(bool createNewInstance) 
    { 
     if(createNewInstance) 
      f1 = new Form1(); 
     else 
      f1 = null; 
    } 
} 
1

Có thể vì Form1 đang cố khởi tạo một Form1 khác mà đang cố gắng tạo một Form1 khác?

0

Nếu mỗi lớp Form1 chứa một cá thể mới của một lớp Form1, bạn buộc phải có ngoại lệ tràn ngăn xếp khi cố gắng tạo một lớp.

Bạn có thể thấy rõ hơn bằng cách cố gắng vẽ các đối tượng trên một tờ giấy, mô phỏng không gian chúng chiếm trong bộ nhớ và không gian bị chiếm đóng bởi con cái của chúng - nhưng hãy nhớ, mỗi Biểu mẫu 1 phải có cùng kích thước!

6

Tạo một thể hiện của Form1 sẽ làm cho thuộc tính f1 được khởi tạo với một thể hiện của Form1 sẽ làm cho thuộc tính f1 được khởi tạo với một thể hiện của Form1 sẽ làm cho thuộc tính f1 được khởi tạo với một thể hiện của Form1 điều này sẽ làm cho thuộc tính f1 được khởi tạo với một thể hiện của Form1 sẽ làm cho thuộc tính f1 được khởi tạo với một thể hiện của Form1 sẽ làm cho thuộc tính f1 được khởi tạo với một thể hiện của Form1 sẽ làm cho thuộc tính f1 được khởi tạo với một thể hiện của Form1 mà sẽ gây ra các tài sản f1 được khởi tạo với một thể hiện của Form1 mà sẽ gây ra tài sản f1 được khởi tạo với một thể hiện của Form1 mà sẽ gây ra tài sản f1 được khởi tạo với một thể hiện của Form1 mà sẽ gây ra thuộc tính f1 được khởi tạo với một thể hiện của F orm1 mà sẽ gây ra các tài sản f1 được khởi tạo với một thể hiện của Form1 mà sẽ gây ra các tài sản f1 được khởi tạo với một thể hiện của Form1 mà sẽ ... Stack Overflow!

Trong một phương thức trong lớp học, 'f1' sẽ là địa phương và chỉ tồn tại trong suốt cuộc gọi. Trừ khi bạn gọi cùng một phương thức trên Form1 được khởi tạo thì sẽ không có Form1 tiếp theo nào được tạo ra.

1

Nếu bạn đang ở trong hàm tạo mới của Form1, phiên bản Form1 đã được tạo. Vì vậy, trước khi nó được tạo xong, bạn đang tạo một cái khác, thì cái đó cũng vậy. Trước khi chương trình của bạn tải, quá nhiều form1 đang diễn ra trong ngăn xếp ... làm tràn ngăn xếp.