6
votes

Exception de StackoverFlow dans la classe de formulaire

Lorsque j'essaie de créer un objet de la classe de formulaire dans la classe de formulaire, il donne une exception car Stackoverflow survenue. Cependant, lorsque je déclare l'objet de la classe de formulaire dans une méthode, cela fonctionne bien. Le code est comme suit. :

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;
            }
        }
    }
}

}


1 commentaires

+1 Stackoverflow Exception!


7 Réponses :


4
votes

Vous créez une instance privée de form1 lorsque Form1 est créée, il s'agit donc d'une boucle sans fin:

Quelque part dans votre code, vous créez votre première instance Form1. Lorsque cette instance est la création, cela crée une nouvelle instance de formulaire1. Cette instance crée également une instance de form1 et encore, et etc.

Ainsi, lors de la création d'une instance, toutes les variables sont initialisées et lorsque vous les déclarez comme ceci: Form1 F1 = nouveau formulaire1 () Cela instatite automatiquement une nouvelle instance du formulaire.

Je suggère de ne pas avoir de nouvelle instance de votre formulaire1 à l'intérieur de votre formulaire1, mais si vous A vraiment besoin de créer une méthode pour faire l'instance:

modifier le formulaire Form1 F1 = nouveau formulaire1 (); dans formulaire1 F1; . Et créer une méthode: xxx

mais: n'appelez pas cette méthode dans le constructeur! Ou bien vous aurez le même problème: -)


0 commentaires

1
votes

Le formulaire est instancié, puis il traite les champs privés, qui instancitaient le formulaire1, qui instancite ensuite les champs privés (recherche de formulaire1), qui instancie ensuite cet objet et traite les champs privés, se poursuivant.

C'est pourquoi cela se produit, alors que, dans une méthode, une méthode ne s'exécute que lorsqu'elle est appelée, aucune initialisation interne.

Pourquoi, quand sous forme1, avez-vous besoin d'un autre exemple de la même forme?


0 commentaires

2
votes

C'est parce que chaque fois que vous créez une instance de votre classe, cela crée une autre instance de votre classe et ainsi de suite ... et ainsi de suite ... et ainsi de suite ...

En d'autres termes, vous avez un Récursion infinie Lorsque vous essayez de créer une instance de votre classe.

Vous devez ajouter une sorte de contrôle autour de savoir si une nouvelle instance de Form1 est créée au moment de la construction. Une solution simple (et non complète) serait quelque chose comme: xxx


0 commentaires

1
votes

pourrait-il être parce que la forme1 tente d'instancier une autre form1 qui tente d'instancier une autre formulaire, etc.?


0 commentaires

0
votes

Si chaque classe Form1 contient une nouvelle instance d'une classe Form1, vous devez avoir une exception de dépassement de pile lors de la tentative de création d'une.

Vous pouvez le voir plus clairement en essayant de dessiner les objets sur une feuille de papier, simulant l'espace qu'ils occupent en mémoire et l'espace occupé par leurs enfants - mais rappelez-vous que chaque formulaire 1 doit être de la même taille! < / p>


0 commentaires

6
votes

Créer une instance de form1 entraînerait l'initialisation de la propriété F1 avec une instance de form1 qui provoquerait l'initialisation de la propriété F1 avec une instance de form1 qui provoquerait l'initialisation de la propriété F1 avec une instance de formulaire qui entraînerait l'initialisation de la propriété F1 avec une instance de form1 qui provoquerait l'initialisation de la propriété F1 avec une instance de form1 qui provoquerait l'initialisation de la propriété F1 avec une instance de form1 qui ferait l'initialisation de la propriété F1 avec une instance de form1 qui entraînerait une ininimentation de la propriété F1 avec une instance de form1 qui ferait une initialisation de la propriété F1 avec une instance de form1 qui provoquerait l'initialisation de la propriété F1 avec une instance de formulaire qui causerait la propriété F1 à être initialisée avec une instance de form1 qui provoquerait l'initialisation de la propriété F1 avec une instance de form1 qui causerait la propriété F1 être initialisé avec une instance de form1 qui serait ... Overflow de pile!

Dans une méthode de la classe, le «F1» serait local et n'existe que pour la vie de l'appel. À moins que vous appeliez la même méthode sur le formulaire instancié1, il n'y aurait pas de formulaire ultérieur créé.


0 commentaires

1
votes

Si vous êtes dans le nouveau constructeur de Form1, une instance de form1 est déjà créée. Donc, avant que ce soit fini en cours de création, vous en créez un autre, alors celui-ci fait la même chose. Avant que votre programme ne se charge, trop de formes se rendent sur la pile ... débordant de la pile.


0 commentaires