我的C#程序中出现错误,发生堆栈溢出异常

时间:2011-09-23 02:38:03

标签: c#

我有两种形式。其中一个是用户选择学校课程的表单,请单击“确定”。我用

  
    

public int [] grad_class = new int [2];

  

用于保存学校班级选择的内容。 (类列表是COMBO BOX) 之后,我打开另一个新表格来编辑该班级学生的信息。 我像这样使用Switch:

switch(grad_class)
{
   case "11": something to do..., break;
   case "12": something to do..., break;
}

但是我的问题: 我在形式No.1中定义“grad_class”。所以当我想要使用时,我必须这样做:

form1 f1 = new form1();
f1.grade_class;

并且在表单2中我调用此代码。 在表格No.1我打电话:

form2 f2 = new form2();    

OCCUR STACK OVERFLOW EXCEPTION !!!

1 个答案:

答案 0 :(得分:2)

你说:

form1 f1 = new form1();
f1.grade_class;
  

并且在表单2中我调用此代码。在表格No.1我打电话:

form2 f2 = new form2();    

那么,你的问题就在那里。您在form1中呼叫form2.ctor并在form2呼叫form1.ctor。所以你的代码看起来像这样:

public form1() {
    var f2 = new form2();
}

public form2() {
    var f1 = new form1();
}

当然,这会导致堆栈溢出。这些是异常递归函数。你没有返回条件,所以你耗尽了你的堆栈空间。很简单,发生的事情是机器必须在方法完成时存储关于下一步的状态。它通常将此信息存储在称为堆栈的空间中。虽然堆栈是有界限的,所以如果你通过反复调用方法将太多的“这就是下一步”阻塞到堆栈上,你将耗尽这个堆栈空间并点击臭名昭着的堆栈溢出异常。

编辑:你说:

namespace TeacherBook {
    public partial class ChooseGrade : Form {
        public int[] grad_class=new int[2]; //int array for grade & class (first for Grade,second for class) 
        EditStudent StdForm = new EditStudent();
    }
namespace TeacherBook {
    public partial class EditStudent : Form {
        ChooseGrade ChGrade = new ChooseGrade(); // define form 
    }
}

实际上是我怀疑的。您在ChooseGrade中有一个字段初始值设定项,用于实例化EditStudent的新实例。但EditStudent有一个字段初始值设定项,用于实例化ChooseGrade的新实例。因此,当您实例化ChooseGrade的新实例时,这会导致调用EditStudent的构造函数,这会导致调用ChooseGrade的构造函数,从而导致{{1}的构造函数要调用它,然后继续它,直到你溢出堆栈。