Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
 Аватар для Xkimos
5 / 5 / 5
Регистрация: 10.04.2014
Сообщений: 51

Необработанное исключение типа "System.StackOverflowException" в System.Windows.Forms.dll

30.11.2015, 19:15. Показов 4180. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Столкнулся со следующей проблемой:
При запуске вылезает "Необработанное исключение типа "System.StackOverflowException" в System.Windows.Forms.dll"
Вот код:
Form1.cs:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace Box
{
    public partial class Form1 : Form
    {
        private Ball ball;
        private Box box0 = new Box();
        private Box box1 = new Box();
        private Box box2 = new Box();
        public Form1()
        {
            InitializeComponent();
            SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint | ControlStyles.ResizeRedraw, true);
            game_data game_data = new game_data();
            game_data.reset();
            box0 = new Box { Bounds = new RectangleF((Width / 4) - 50, Height / 2, 80, 30) };
            box1 = new Box { Bounds = new RectangleF((Width / 4) * 2 - 50, Height / 2, 80, 30) };
            box2 = new Box { Bounds = new RectangleF((Width / 4) * 3 - 50, Height / 2, 80, 30) };
        }
    }
    class Ball
    {
        public PointF Location { get; set; }
        public float Radius { get; set; }
        public float Speed { get; set; }
        public Ball()
        {
            Radius = 10;
        }
        public void Update(float dt, int box)
        {
            Speed = 9.8f * dt;
            Location = new PointF((433 / 4) * (box + 1) - 10, Location.Y + Speed * dt);
        }
    }
    class Box
    {
        public RectangleF Bounds;
    }
    class game_data
    {
        public int ochki { get; set; }
        public int ball_sh { get; set; }
        public int level { get; set; }
        public float mnoz { get; set; }
        public int[,] ball_data{ get; set; }
        public void reset()
        {
            ball_data = new int[3,3];
            ochki = 0;
            ball_sh = 5;
            level = 1;
            mnoz = 1f;
            for (int i = 0; i <= 2; i++)
                for (int j = 0; j <= 2; j++)
                    ball_data[i, j] = 0;
            update_label();
        }
        public int[] next_ball_random ()
        {
            int[] mas = new int[2];
            Random randObj = new Random();
            for (int i = 0; i <= 1; i++)
                mas[i] = randObj.Next(0, 3);
            return mas;
        }
        public void update_data (int correct)
        {
            ochki += correct * (int)(10 * mnoz);
            mnoz += level / 10;
            //ball_sh += (int)((level+10) - Math.IEEERemainder((double)(level + 10),(double)(10))) / 10 ;
            ball_sh += (int)Math.Truncate((double)((level + 10) / 10));
            level++;
            update_label();
        }
        private void update_label()
        {
            Form1 Form1 = new Form1();
            Form1.label1.Text = "Уровень " + level;
            Form1.label2.Text = "Очки " + ochki;
        }
    }
}
Form1.Designer.cs: (Я его почти не трогал, только label1 и label2 сделал public в самом конце)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
namespace Box
{
    partial class Form1
    {
        /// <summary>
        /// Требуется переменная конструктора.
        /// </summary>
        private System.ComponentModel.IContainer components = null;
 
        /// <summary>
        /// Освободить все используемые ресурсы.
        /// </summary>
        /// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
 
 #region Код, автоматически созданный конструктором форм Windows
 
        /// <summary>
        /// Обязательный метод для поддержки конструктора - не изменяйте
        /// содержимое данного метода при помощи редактора кода.
        /// </summary>
        private void InitializeComponent()
        {
            this.button1 = new System.Windows.Forms.Button();
            this.label1 = new System.Windows.Forms.Label();
            this.label2 = new System.Windows.Forms.Label();
            this.groupBox1 = new System.Windows.Forms.GroupBox();
            this.button2 = new System.Windows.Forms.Button();
            this.groupBox1.SuspendLayout();
            this.SuspendLayout();
            // 
            // button1
            // 
            this.button1.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
            this.button1.Location = new System.Drawing.Point(6, 5);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(74, 31);
            this.button1.TabIndex = 1;
            this.button1.Text = "Старт";
            this.button1.UseVisualStyleBackColor = true;
            // 
            // label1
            // 
            this.label1.AutoSize = true;
            this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
            this.label1.Location = new System.Drawing.Point(86, 12);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(75, 17);
            this.label1.TabIndex = 2;
            this.label1.Text = "Уровень 0";
            // 
            // label2
            // 
            this.label2.AutoSize = true;
            this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
            this.label2.Location = new System.Drawing.Point(178, 12);
            this.label2.Name = "label2";
            this.label2.Size = new System.Drawing.Size(70, 17);
            this.label2.TabIndex = 3;
            this.label2.Text = "Очки 000";
            // 
            // groupBox1
            // 
            this.groupBox1.Controls.Add(this.button2);
            this.groupBox1.Controls.Add(this.button1);
            this.groupBox1.Controls.Add(this.label1);
            this.groupBox1.Controls.Add(this.label2);
            this.groupBox1.Location = new System.Drawing.Point(0, 0);
            this.groupBox1.Name = "groupBox1";
            this.groupBox1.Size = new System.Drawing.Size(418, 35);
            this.groupBox1.TabIndex = 4;
            this.groupBox1.TabStop = false;
            // 
            // button2
            // 
            this.button2.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
            this.button2.Location = new System.Drawing.Point(317, 5);
            this.button2.Name = "button2";
            this.button2.Size = new System.Drawing.Size(95, 31);
            this.button2.TabIndex = 5;
            this.button2.Text = "Конец игры";
            this.button2.UseVisualStyleBackColor = true;
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(417, 293);
            this.Controls.Add(this.groupBox1);
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
            this.MaximizeBox = false;
            this.Name = "Form1";
            this.Text = "Game";
            this.groupBox1.ResumeLayout(false);
            this.groupBox1.PerformLayout();
            this.ResumeLayout(false);
 
        }
 
        #endregion
 
        private System.Windows.Forms.Button button1;
        public System.Windows.Forms.Label label1;
        public System.Windows.Forms.Label label2;
        private System.Windows.Forms.GroupBox groupBox1;
        private System.Windows.Forms.Button button2;
    }
}
Program.cs: (совсем не трогал)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace Box
{
    static class Program
    {
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}
Все проблемы из за
C#
1
2
            game_data game_data = new game_data();
            game_data.reset();
в Form1.cs. Если удалить game_data.reset(); то всё работает без всяких проблем
отладчик указывает на
C#
1
this.groupBox1.ResumeLayout(false);
(Это Form1 в генерированном коде)
ради эксперимента попробовал поставить true тогда отладчик стал указывать на
C#
1
this.ResumeLayout(false);
(Это последняя строка в генерированном коде)
В гугле кроме того что и так пишет отладчик (он кстати пишет "Убедитесь в отсутствии бесконечного цикла или рекурсии.") нашёл случай с двумя формами, но описанное там решение только для форм.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.11.2015, 19:15
Ответы с готовыми решениями:

Необработанное исключение типа "System.StackOverflowException" в System.Windows.Forms.dll
Есть класс Controls и класс формы. При нажатии на кнопку, создается другая кнопка. В классе Controls описано само создание и действие при...

Необработанное исключение типа "System.ArgumentException" в System.Windows.Forms.dll
Всем привет, пытаюсь сделать переход на форму по кнопке но вылазит следующее: С другими кнопками всё хорошо.

Необработанное исключение типа "System.IO.FileNotFoundException" произошло в System.Drawing.dll
Выскакивает вот такая ошибка, не знаю, что делать. Я начинающий программист, очень прошу объяснить так, что бы я понял) Очень прошу помочь,...

8
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
30.11.2015, 20:25
C#
1
2
3
4
5
6
        private void update_label()
        {
            Form1 Form1 = new Form1();
            Form1.label1.Text = "Уровень " + level;
            Form1.label2.Text = "Очки " + ochki;
        }
Что это?
0
 Аватар для Xkimos
5 / 5 / 5
Регистрация: 10.04.2014
Сообщений: 51
30.11.2015, 20:51  [ТС]
Someone007, Этот метод должен обновлять значение label1 и label2
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
30.11.2015, 22:48
Лучший ответ Сообщение было отмечено Xkimos как решение

Решение

Цитата Сообщение от Xkimos Посмотреть сообщение
Этот метод должен обновлять значение label1 и label2
Где? Будет ли какое-либо отношение иметь новая Form1 к той, что была создана в 19-й строке Program.cs?
Вариант передачи данных:
1) Перенесите в класс Form1 метод update_label():
C#
1
2
3
4
5
private void update_label(int level, int score)
{
    label1.Text = "Уровень " + level.ToString();
    label2.Text = "Очки " + score.ToString();
}
2) объявляете в неймспейсе публичного делегата:
C#
1
public  delegate void SetLabels (int level, int score);
3) в классе game_data добавляете публичное поле типа ранее созданного делегата:
C#
1
public SetLabels setLabels;
4) в классе Form1 после создания объекта game_data инициализируете поле setLabels
game_data.setLabels = update_label;

5) в методах класса game_data вместо вызова
C#
1
update_label();
вызываете setLabels и передаете в форму значения:
C#
1
setLabels(level, ochki); //но я бы ochki переименовал в score, points и т.п., Level ведь не назвали словом uroven
1
 Аватар для Xkimos
5 / 5 / 5
Регистрация: 10.04.2014
Сообщений: 51
30.11.2015, 23:26  [ТС]
Даценд, Новой формы не будет, всё происходит в одной форме.

Добавлено через 20 минут
Даценд, сlass game_date Нужен для управления "постоянными" данными игры
Mетод update_labe должен обновлять значения уровня и счёта при каждом пройденном уровне (update_data пересчитывает значения) или же в случаи если пользователь решил начать новую игру (reset сбрасывает все значения на начальные)
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
01.12.2015, 00:49
Цитата Сообщение от Xkimos Посмотреть сообщение
Новой формы не будет, всё происходит в одной форме.
Зачем тогда создается еще один экземпляр Form1:
Цитата Сообщение от Someone007 Посмотреть сообщение
Form1 Form1 = new Form1();
В предыдущем посте я показал, как можно из класса game_date управлять элементами label1 и label2 на форме.
1
 Аватар для Xkimos
5 / 5 / 5
Регистрация: 10.04.2014
Сообщений: 51
01.12.2015, 03:45  [ТС]
Даценд, я учёл все ваши рекомендации и проблема с System.StackOverflowException вродебы решена, но появилось предупреждение "Полю "Box.game_data.setLabels" нигде не присваивается значение, и оно обязательно содержит значение по умолчанию null" (Строка 57)
Вот обновлённый код:
Form1.cs:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace Box
{
    public delegate void SetLabels(int level, int score);
    public partial class Form1 : Form
    {
        private Ball ball;
        private Box box0 = new Box();
        private Box box1 = new Box();
        private Box box2 = new Box();
        public Form1()
        {
            InitializeComponent();
            SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint | ControlStyles.ResizeRedraw, true);
            game_data game_data = new game_data();
            game_data.reset();
            box0 = new Box { Bounds = new RectangleF((Width / 4) - 50, Height / 2, 80, 30) };
            box1 = new Box { Bounds = new RectangleF((Width / 4) * 2 - 50, Height / 2, 80, 30) };
            box2 = new Box { Bounds = new RectangleF((Width / 4) * 3 - 50, Height / 2, 80, 30) };
        }
        private void update_label(int level, int score)
        {
            label1.Text = "Уровень " + level.ToString();
            label2.Text = "Очки " + score.ToString();
        }
    }
    class Ball
    {
        public PointF Location { get; set; }
        public float Radius { get; set; }
        public float Speed { get; set; }
        public Ball()
        {
            Radius = 10;
        }
        public void Update(float dt, int box)
        {
            Speed = 9.8f * dt;
            Location = new PointF((433 / 4) * (box + 1) - 10, Location.Y + Speed * dt);
        }
    }
    class Box
    {
        public RectangleF Bounds;
    }
    class game_data
    {
        public SetLabels setLabels;
        public int points { get; set; }
        public int ball_sh { get; set; }
        public int level { get; set; }
        public float mnoz { get; set; }
        public int[,] ball_data{ get; set; }
        public void reset()
        {
            ball_data = new int[3,3];
            points = 0;
            ball_sh = 5;
            level = 1;
            mnoz = 1f;
            for (int i = 0; i <= 2; i++)
                for (int j = 0; j <= 2; j++)
                    ball_data[i, j] = 0;
            setLabels(level, points);
        }
        public int[] next_ball_random ()
        {
            int[] mas = new int[2];
            Random randObj = new Random();
            for (int i = 0; i <= 1; i++)
                mas[i] = randObj.Next(0, 3);
            return mas;
        }
        public void update_data (int correct)
        {
            points += correct * (int)(10 * mnoz);
            mnoz += level / 10;
            //ball_sh += (int)((level+10) - Math.IEEERemainder((double)(level + 10),(double)(10))) / 10 ;
            ball_sh += (int)Math.Truncate((double)((level + 10) / 10));
            level++;
            setLabels(level, points);
        }
    }
}
При попытки запустить на строке 73 вылезает Необработанное исключение типа "System.NullReferenceException" в Box.exe. Дополнительные сведения: Ссылка на объект не указывает на экземпляр объекта.
Судя по советам по устранению неполадок это именно из за того что setLabels = null
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
01.12.2015, 06:23
Цитата Сообщение от Xkimos Посмотреть сообщение
При попытки запустить на строке 73 вылезает Необработанное исключение типа "System.NullReferenceException" в Box.exe. Дополнительные сведения: Ссылка на объект не указывает на экземпляр объекта.
Судя по советам по устранению неполадок это именно из за того что setLabels = null
Потому что
Цитата Сообщение от Даценд Посмотреть сообщение
4) в классе Form1 после создания объекта game_data инициализируете поле setLabels
game_data.setLabels = update_label;
пропустили.
1
 Аватар для Xkimos
5 / 5 / 5
Регистрация: 10.04.2014
Сообщений: 51
01.12.2015, 12:31  [ТС]
Даценд, Someone007, Большое спасибо, очень сильно помогли.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.12.2015, 12:31
Помогаю со студенческими работами здесь

Необработанное исключение типа "System.ArgumentException" в System.Drawing.dll
Доброго времени суток. Имеется проект на C# &amp; Windows Forms. В коде основной формы имеется публичный класс Global_Data с публичными...

Необработанное исключение типа "System.IO.FileNotFoundException" в System.Drawing.dll
Пытаюсь добавить картинку в форму через код. Пользуюсь строчкой: pictureBox1.Image = Image.FromFile(&quot;C:\\nVuaQfAxU0E.jpg&quot;); ...

Необработанное исключение типа "System.ArgumentException" в System.Drawing.dll
Пишу приложение для работы с Графами (по учёбе). Есть Панель, в которой я рисую. Заполняю практически всю область белым квадратом. ...

Как исправить исключение System.StackOverflowException в System.Drawing.dll
An unhandled exception of type 'System.StackOverflowException' occurred in System.Drawing.dll что делать все работала нормально и...

Возникает ошибка "необработанное исключение типа System.StackOverflowException"
Привет. Возникает ошибка &quot;необработанное исключение типа System.StackOverflowException&quot; На этой строке: Form1 Control = new Form1(); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru