Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 13.04.2021
Сообщений: 10

Не заполняется массив полей класса, Visual Studio выдаёт System.NullReferenceException

05.06.2022, 22:15. Показов 859. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Создал экземпляр класса Usp массив полей group, куда должны заноситься значения оценок для определёноого студента

Это всё в файле Program.cs

C#
1
2
public static Uspishnist Usp = new Uspishnist(); //экземпляр класса Uspishnist
public static Uspishnist[] group;
Есть функция в файле с классом и реализацией, где создаётся новый экземпляр массива (или как он правильно назвывается)

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
namespace Reyt_systema_uspishnosti.Properties
{
    class Uspishnist
    {
      
        public int ozinka_sys_pr;
        public int ozinka_NDEKSM;
        public int ozinka_men_mar;
        public int ozinka_Web_Des;
 
        public void vvod_danuh(Uspishnist[] group)
        {
            int i;
            int s;
            Form1 f = new Form1(); // переменная со ссылкой на форму 
            group = new Uspishnist[4];
        
            do 
            {
                try
                {
                    s = int.Parse(f.textBox1.Text);
                    group[0].ozinka_sys_pr = s; 
                    if ((group[0].ozinka_sys_pr < 1) || (group[0].ozinka_sys_pr > 5))
                    {
                        MessageBox.Show("Некорректный ввод. Оценка должна быть в диапазоне от 1 до 5 баллов. Введите ещё раз.");
                    }
                }
                catch
                {
                    MessageBox.Show("Ошибка.");
                }
            } while ((Program.group[0].ozinka_sys_pr < 1) || (Program.group[0].ozinka_sys_pr > 5));
Это всё срабатывает при нажатии на кнопку
C#
1
2
3
4
5
private void button1_Click(object sender, EventArgs e)
        {
            Program.Usp.vvod_danuh(Program.group);
            Active(true);
        }
Почему-то при вводе данных в textBox1 и соответственно нажатия на кнопку вылетает исключение и подпись, что group[] было null. Не пойму, как так происходит, что массив не заполняется, я нигде не присваивал ему null.
Может чересчур подробно всё описал, но надеюсь, это повлияет на качество ответа
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.06.2022, 22:15
Ответы с готовыми решениями:

при использовании класса CFileDialog выдает ошибку на Visual Studio 2010
листинг кнопки &quot;сгенерировать файл&quot;: void CinterfaceDlg::OnBnClickedGenf() {char Filter =&quot;TextFile(*.txt),(*.doc)|*.txt;*.doc|All...

System.NullReferenceException для массива класса
class outlet { public string log{ get; set; } } var outlet1 = new outlet(); outlet1.log = &quot;random...

Пытаюсь закрасить head UserControl из XML файла, но выдает System.NullReferenceException
Когда компилирую код для закрашивания head элемента из XML, компилятор присваивает prop значение null, и выдает Exeption Вот...

14
Эксперт .NET
 Аватар для Rius
13089 / 7649 / 1671
Регистрация: 25.05.2015
Сообщений: 23,290
Записей в блоге: 14
05.06.2022, 22:26
Цитата Сообщение от StudACH Посмотреть сообщение
подпись, что group[] было null. Не пойму, как так происходит
Потому что, как минимум, в методе вы создаёте новый массив и забываете об этом по выходу из него.
Весь код ужасен.
0
0 / 0 / 0
Регистрация: 13.04.2021
Сообщений: 10
05.06.2022, 22:44  [ТС]
Как сделать, чтобы вводилось всё?
0
Эксперт .NET
 Аватар для Rius
13089 / 7649 / 1671
Регистрация: 25.05.2015
Сообщений: 23,290
Записей в блоге: 14
06.06.2022, 06:43
Весь код выложите и задание озвучьте.
0
0 / 0 / 0
Регистрация: 13.04.2021
Сообщений: 10
06.06.2022, 11:43  [ТС]
Файл 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
23
24
25
26
27
28
29
30
using Reyt_systema_uspishnosti.Properties;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace Reyt_systema_uspishnosti
{
    static class Program
    {
        
        public static Form1 f1; // переменная для работы с формой f1, для вызова её в классе формы
        public static Form2 f2; // переменная для работы с формой f2
        public static Uspishnist Usp = new Uspishnist(); //экземпляр класса Uspishnist
        public static Uspishnist[] group = new Uspishnist[4]; //новый экземпляр массива полей класса
 
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1()); 
            
    }
}
}
Uspishnist.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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Reyt_systema_uspishnosti;
 
namespace Reyt_systema_uspishnosti.Properties
{
    class Uspishnist
    {
        public int ozinka_sys_pr;
        public int ozinka_NDEKSM;
        public int ozinka_men_mar;
        public int ozinka_Web_Des;
 
        public void vvod_danuh(Uspishnist[] group)
        {
            const int i=10;
            int s;
            Form1 f = new Form1();
    
            do 
            {
                try
                {
                    s = int.Parse(f.textBox1.Text);
                    group[0].ozinka_sys_pr = s; 
                    if ((group[0].ozinka_sys_pr < 1) || (group[0].ozinka_sys_pr > 5))                    {
                        MessageBox.Show("Некорректный ввод. Оценка должна быть в диапазоне от 1 до 5 баллов. Попробуйте ещё раз.");
                    }
                }
                catch
                {
                    MessageBox.Show("Ошибка");
                }
            } while ((Program.group[0].ozinka_sys_pr < 1) || (Program.group[0].ozinka_sys_pr > 5));
        }
Тоесть данные должны присваиваться с textBox-а в массив. но реально это не работает - вылетает исключение, что ссылка на обьект не является экземпляром обьекта.
Вопрос: где дрова и как сделать, чтобы все корректно работало?
0
Эксперт .NET
 Аватар для Rius
13089 / 7649 / 1671
Регистрация: 25.05.2015
Сообщений: 23,290
Записей в блоге: 14
06.06.2022, 12:34
Весь код это значит все файлы исходного кода (*.cs), имеющиеся в проекте. А не только те участки, о которых вы думаете, что именно они нужны. Программу нужно скомпилировать.
Цитата Сообщение от StudACH Посмотреть сообщение
Тоесть данные должны присваиваться с textBox-а в массив. но реально это не работает - вылетает исключение, что ссылка на обьект не является экземпляром обьекта.
Массив ещё не создан, потому exception.
Цитата Сообщение от StudACH Посмотреть сообщение
где дрова и как сделать, чтобы все корректно работало?
Да здесь неправильно вообще всё.
Статические публичные поля у Program, публичные поля у Uspishnist.
Непонятно, откуда вызов vvod_danuh и что туда передаётся.
Создание новой формы, чтобы получить данные из текущей (это вообще прям классика у новичков).
Попытка распарсить строку без проверки правильности.
Обращение только к нулевому элементу, хотя передаётся массив.
...
0
0 / 0 / 0
Регистрация: 13.04.2021
Сообщений: 10
07.06.2022, 13:42  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
Статические публичные поля у Program, публичные поля у Uspishnist.
По поводу полей f1 и f2- я сделал, как на этом ресурсе в 3-м способе
https://codernotes.ru/articles... rugoj.html
По канонам или нет - это другой вопрос, я лишь УЧУ язык.
Цитата Сообщение от Rius Посмотреть сообщение
Непонятно, откуда вызов vvod_danuh и что туда передаётся
С 1 сообщения
Цитата Сообщение от StudACH Посмотреть сообщение
private void button1_Click(object sender, EventArgs e)
        {
            Program.Usp.vvod_danuh(Program.group);
            Active(true);
        }
На функцию Active не нужно обращать внимания, её работа с проблемой не связана.
Цитата Сообщение от Rius Посмотреть сообщение
Создание новой формы, чтобы получить данные из текущей (это вообще прям классика у новичков).
Вот тут интересно. И где же правильно будет создать экземпляр? в Program.cs?
Цитата Сообщение от Rius Посмотреть сообщение
Обращение только к нулевому элементу, хотя передаётся массив
В методе vvod_danuh дальше идут аналогичные куски кода с циклом do...while, для каждого текстбокса на форме смысла нагромождать код не вижу. Если ошибка в одной части, значит она просто дублируется дальше.
За замечания - спасибо, но мне нужно решение. Если можно, то лучше по существу, ибо время поджимает. Может в каких-то темах нужно разобраться и найдётся ответ?
Миниатюры
Не заполняется массив полей класса, Visual Studio выдаёт System.NullReferenceException  
0
Эксперт .NET
 Аватар для Rius
13089 / 7649 / 1671
Регистрация: 25.05.2015
Сообщений: 23,290
Записей в блоге: 14
07.06.2022, 15:20
Цитата Сообщение от StudACH Посмотреть сообщение
Вот тут интересно. И где же правильно будет создать экземпляр? в Program.cs?
Он там уже создаётся:
C#
1
Application.Run(new Form1());
И в методе (методе именно этого класса)
C#
1
2
3
4
private void button1_Click(object sender, EventArgs e)
{
  ...
}
этот экземпляр доступен по ссылке this, например
C#
1
string str = this.textBox1.Text;
this можно и не писать, будет работать. Но лучше пишите, будет очевидно, что обращение идёт к текущему классу, а не чёрт знает куда.

Добавлено через 4 минуты
Здесь не надо делать зацикливание с требование ввода числа заново. Это методы консольных приложений, здесь они не в тему.
По нажатию кнопки можете проверить значения всех полей ввода и подсветить те, что содержат ошибочные значения, затем вывести окно сообщения с пояснением.
Если же проверка пройдена, то что-то с полученными данными делать.
0
0 / 0 / 0
Регистрация: 13.04.2021
Сообщений: 10
07.06.2022, 15:50  [ТС]
Ага, тоесть код метода vvod_danuh переместить в файл кода формы?
Ибо хотелось отдельно класс с реализацией функционала сделать
0
Эксперт .NET
 Аватар для Rius
13089 / 7649 / 1671
Регистрация: 25.05.2015
Сообщений: 23,290
Записей в блоге: 14
07.06.2022, 16:11
Можно и отдельно.
Вот небольшой пример.
Вложения
Тип файла: zip StudACH.zip (12.4 Кб, 3 просмотров)
0
0 / 0 / 0
Регистрация: 13.04.2021
Сообщений: 10
08.06.2022, 11:25  [ТС]
Спасибо.
Решил свою проблему тем, что создал экземпляр массива обьектов в классе Program
C#
1
public static Uspishnist[] group = new Uspishnist[4];
Потом в Main сделал цикл, где проинициализировал каждый элемент отдельно.
C#
1
2
3
4
5
for (int i = 0; i <= 3; i++)
{
      group[i] = new Uspishnist();
}
Application.Run(new Form1());
Вроде бы нужно, чтобы это происходило именно ДО инициализации формы. И тогда всё везде создаётся и Exception нет.
Ну и определиться, передача в метод идёт по ссылке или по значению. У меня так
C#
1
public void vvod_danuh(ref Uspishnist[] group)
И при вызове передаётся тоже ссылка
C#
1
            Program.Usp.vvod_danuh(ref Program.group);
0
Эксперт .NET
 Аватар для Rius
13089 / 7649 / 1671
Регистрация: 25.05.2015
Сообщений: 23,290
Записей в блоге: 14
08.06.2022, 12:51
В program таких данных быть не должно.
Зачем вам до ициниализации формы? Почему нельзя сделать при инициализации?
0
0 / 0 / 0
Регистрация: 13.04.2021
Сообщений: 10
08.06.2022, 22:04  [ТС]
Может правильнее и при инициализации, но массив всё равно не заполняется, как ни крути. Я изменил поля класса, добавил string (для ввода имени, фамилии и группы), и NumericUpDown на форму (для оценок) но при считывании из текстовых полей данные не хотят присваиваться. Ещё больше запутался
0
Эксперт .NET
 Аватар для Rius
13089 / 7649 / 1671
Регистрация: 25.05.2015
Сообщений: 23,290
Записей в блоге: 14
09.06.2022, 16:17
Надо правильно данные возвращать.
Вложения
Тип файла: zip StudACH.zip (12.5 Кб, 2 просмотров)
0
0 / 0 / 0
Регистрация: 13.04.2021
Сообщений: 10
11.06.2022, 18:06  [ТС]
Теперь РЕАЛЬНО заработало, как и было задумано. Заменил поля класса на массивы. Тоесть вместо тех, что закомментированы - теперь такие обьявления:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Uspishnist
    {
        //секція для закритих елементів класу (фактично їх немає)
        //секція для відкритих елементів
        //перелік полів структури класу 
        /* public string gr;
        public string name;
        public string surname;
        public string subj_1;
        public string subj_2;
        public string subj_3;
        public int ozinka_1=0;
        public int ozinka_2=0;
        public int ozinka_3=0;// = 0;*/
        public string[] gr_mas = new string[20];
        public string[] name_mas = new string[20];
        public string[] surname_mas = new string[20];
        public string[] subj_1_mas = new string[20];
        public string[] subj_2_mas = new string[20];
        public string[] subj_3_mas = new string[20];
        public int[] ozinka_1_mas = new int[20];
        public int[] ozinka_2_mas = new int[20];
        public int[] ozinka_3_mas = new int[20];
И в момент нажатия кнопки (после проверки всех условий на коректность) идёт присвоение:
C#
1
2
3
4
5
6
7
8
9
10
11
12
gr_mas[k] = f1.textBox1.Text;
                name_mas[k] = f1.textBox2.Text;
                surname_mas[k] = f1.textBox3.Text;
                //введення назв предметів (має бути 3)
                subj_1_mas[k] = f1.textBox4.Text;
                subj_2_mas[k] = f1.textBox5.Text;
                subj_3_mas[k] = f1.textBox6.Text;
                //введення оцінок з введених предметів
                ozinka_1_mas[k] = (int)f1.numericUpDown1.Value;
                ozinka_2_mas[k] = (int)f1.numericUpDown2.Value;
                ozinka_3_mas[k] = (int)f1.numericUpDown3.Value;
                k++;
Переменную k можно обьявлять в рабочей форме или в классе Program. Тут она в работает в роли счётчика, чтобы отвечать за количество успешных выполнений метода vvod_danuh и быть индексом для соответственного элемента массива, который нужно заполнить данными
Массив так же само обьявлялся
C#
1
public static Uspishnist[] group = new Uspishnist[20];
Хорошо, если кому-то это спасёт жизнь. Долго суетился, чтобы привести код в корректное состояние
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.06.2022, 18:06
Помогаю со студенческими работами здесь

System.NullReferenceException при обращении к свойству класса
private void TapOnTile(object sender, GestureEventArgs e) { MatrixTransform.M12 = 0.03; } На...

Почему System.NullReferenceException в массиве обьектов класса?
кто может подсказать , а то я что то не пойму почему выдает исключение : System.NullReferenceException в student.Name (Studet class) ...

Visual Studio 2008 Professional или Visual Studio 2008 Team System?
Доброго времени суток всем!!! Предстал перед дилеммой!!!:wall: Чем отличаются(если их вообще можно сравнивать) Visual Studio 2008...

Компиляция в Visual Studio Team System (Visual Basic)
Здравствуйте, Создал проект формы рабочий, но exe в bin/Debug не работает на другом компьютере, хотя Framework 3.5 там есть. В чем может...

Выдает ошибку: System.NullReferenceException: "Ссылка на объект не указывает на экземпляр объекта."
public Form1() { string letters = new string { &quot;А&quot;, &quot;Б&quot;, &quot;В&quot;, &quot;Г&quot;, &quot;Д&quot;, &quot;Е&quot;, &quot;Ж&quot;, &quot;З&quot;, &quot;И&quot;, &quot;Й&quot;, &quot;К&quot;, &quot;Л&quot;,...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru