为什么普通的类实例化会导致未处理的溢出异常?

时间:2013-09-02 11:07:51

标签: c# class exception stack-overflow

除了正常的类初始化之外,我看不到任何其他内容。

这是班级Bet.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Lab_ADayAtTheRaces
{
public class Bet : Form1
{
    public int Bets_Joe;
    public int Bets_Bob;
    public int Bets_Al;
    public int Dog_Joe;
    public int Dog_Bob;
    public int Dog_Al;

    public int Amount;
    public int Dog;
    public Guy Bettor;

    public string GetDescription()
    {
        Amount = (int)numericUpDownBucksToBet.Value;
        Dog = (int)numericUpDownDogToBetOn.Value;
        //Bettor =
        return Bettor + " placed a bet in the amount of " + Amount + " bucks on dog number " + Dog;
    }

    public int PayOut(int Winner)
    {
        return Winner;
    }

    public void MakeBets()
    {
        if (joeRadioButton.Checked == true)
        {
            Bets_Joe = (int)numericUpDownBucksToBet.Value;
            Dog_Joe = (int)numericUpDownDogToBetOn.Value;
        }

        else if (bobRadioButton.Checked == true)
        {
            Bets_Bob = (int)numericUpDownBucksToBet.Value;
            Dog_Bob = (int)numericUpDownDogToBetOn.Value;
        }

        else if (alRadioButton.Checked == true)
        {
            Bets_Al = (int)numericUpDownBucksToBet.Value;
            Dog_Al = (int)numericUpDownDogToBetOn.Value;
        }
    }

}

}

以下是抛出异常的代码:

namespace Lab_ADayAtTheRaces
{
public partial class Form1 : Form
{
    Bet bets = new Bet(); //**THIS LINE THROWS THE STACKOVERFLOW EXCEPTION**

    Greyhound[] dogs = new Greyhound[3];

它要我多说些什么,但我没有更多要添加,所以我只是在这里和这里添加一些行。 它要我多说些什么,但我没有更多要添加,所以我只是在这里和这里添加一些行。 它要我多说些什么,但我没有更多要添加,所以我只是在这里和这里添加一些行。 它要我多说些什么,但我没有更多要添加,所以我只是在这里和这里添加一些行。 任何帮助都非常适合...提前感谢 克里斯蒂安

1 个答案:

答案 0 :(得分:11)

您的Bet继承自Form1,因此Bet()会致电Form1(),而Form1()会再次致电Bet() - >一次又一次 - > StackOverflow

提示:我们不应该在其构造函数或类定义中调用类的构造函数,如下所示:

public class Form1 : Form {
    public Form1(){
    }
    public Form1(string s){
    }
    public Form1 f = new Form1();//this will throw StackOverflowException
    public Form1 f = new Form1("");//this will also throw StackOverflowException       
    //Form2 inherits from Form1
    public Form2 f = new Form2(); //this will throw StackOverflowException
}
//or
public class Form1 : Form {
    public Form1(){
        Form1 f = new Form1();//This will throw stackoverflowexception
        Form1 f = new Form1("");//This won't throw any exception
    }
    public Form1(string s){
    }
}

初始化类时,在调用构造函数之前首先初始化所有成员,因此在初始化Bet bets = new Bet();之前执行行Form1。所以你必须避免它。要初始化new Bet(),您应该在某种情况下调用它,以便通过调用构造函数(例如Load)永远不会触发事件。

Bet bets;//Just declare it without initializing it
private void Form1_Load(object sender, EventArgs e){
   bets = new Bet();
}