Ошибка «Ссылка на объект не установлена на экземпляр или индекс вне диапазона» при добавлении значений в списки

#asp.net

#asp.net

Вопрос:

Ниже приведен файл моего класса, имена которого отличаются от того, которое используется в проекте.

 public partial class College
{
public List<Students> Students;
}
public partial class Students
{
public List<Activity> Activity;
}
public partial class Activity{
public List<string> Name;
}
  

Ниже приведен мой код aspx.cs

             College.Students.Add(new Students{ studentno= studentnumber.text});
            int index2 = College.Students.FindIndex(c => c.studentno== lineno);
            College.Students[index2].Activity= new List<Activity>();
            College.Students[index2].Activity.Add(new Activity{ });
            int k = (College.Students[index2].Activity.Count) - 1;

            College.Students[index2].Activity[k].Name = new List<string>();

            string ctrlStr = String.Empty;

            foreach (string ctl in Page.Request.Form)
            {
                if (ctl.Contains("Name"))
                {
                    ctrlStr = ctl.ToString();
                    College.Students[index2].Activity[k].Name[0] = (Request.Form[ctrlStr]);--- It errors out here...not understanding the reason...Am i missing any line of code

                }
  

Ответ №1:

Ссылка на объект не установлена на экземпляр объекта

Измените объявление списков в ваших классах на:

 public List<Students> Students = new List<Students>();
  

Просто public List<Students> Students; вы говорите, что это Students существует, но на самом деле не настраиваете его (вы устанавливаете его на null ), поэтому вы не можете использовать ни один из методов или свойств, которые поставляются с List<T> , пока вы не инициализируете его.

Индекс вне диапазона

Эта строка выводит индекс за пределы диапазона

 College.Students[index2].Activity[k].Name[0] 
  

потому что, несмотря на то, что вы обновили Name до List<string> , вы еще ничего к нему не добавили, поэтому пытаетесь ссылаться на несуществующий индекс. В дополнение к этому используйте:

 College.Students[index2].Activity[k].Name.Add((Request.Form[ctrlStr]);
  

Комментарии:

1. Однако это только первая проблема. Ему также необходимо узнать, что он работает с другим экземпляром своего класса при каждом запросе — каждая обратная передача или событие будут воссоздавать эти списки.

2. Также сделайте то же самое для действия и имени.

3. @Richard Schneider: Действие и имя в примере кода изменены, но я использовал множественное число списков и классов , чтобы предположить, что это всего лишь пример. Очевидно, что рекомендуется не оставлять свои объекты в непригодном состоянии с самого начала 🙂

4. @Joel Coehoorn: Это правда, но я не знаю, действительно ли это входит в рамки вопроса, который касался конкретно двух исключений… Кроме того, я собираюсь подставить шею и сказать, что «Джанет» — это «она», а не «он» 😉

Ответ №2:

Вам необходимо инициализировать списки

 public partial class College
{
    public List<Students> Students = new List<Students>();
}
public partial class Students
{
    public List<Activity> Activity = new List<Activity>();
}
public partial class Activity{
    public List<string> Name = new List<string>();
}