Ссылка на нулевой объект - PullRequest
2 голосов
/ 16 сентября 2010

Использование Nunit для проверки кода C # с помощью следующего блока кода:

foreach (XmlNode node in nodeList)
{
    thisReport.Id = node.Attributes.GetNamedItem("id").Value;
    thisReport.Name = node.Attributes.GetNamedItem("name").Value;
    thisReport.Desc = node.Attributes.GetNamedItem("desc").Value;
    if (node.SelectNodes("subreport").Count > 0)
    {
        thisReport.HasSubReport = true;
        subReportNodeList = node.SelectNodes("subreport");
        foreach(XmlNode subNode in subReportNodeList)
        {
            mySubReport.ParentID = node.Attributes.GetNamedItem("id").Value;
            mySubReport.Priority = subNode.Attributes.GetNamedItem("priority").Value;
            mySubReport.SubReportId = subNode.Attributes.GetNamedItem("id").Value;
            mySubReport.SubReportName = subNode.Attributes.GetNamedItem("name").Value;
            string sTime = subNode.Attributes.GetNamedItem("time").Value;
            mySubReport.Time = Convert.ToInt16(sTime);
            thisReport.SubReportsList.Add(mySubReport);
        }
    }
    else
    {
        thisReport.HasSubReport = false;
    }
    reports.Add(thisReport);
}

Код завершается с нулевой ссылкой на объект в строке:

            thisReport.SubreportsList.Add(mySubReport)

Но, глядя на местных жителей, thisReport существует и имеет значения, назначенные в верхней части блока, а mySubReport существует и имеет значения, назначенные непосредственно над строкой, в которую он добавлен в thisReport. Все значения в mySubReport действительны, а SubReportsList в thisReport является общим списком типа SubReport.

Так, где нуль? Это кажется таким простым, это должно быть что-то действительно очевидное, чего я не вижу.

Ответы [ 6 ]

5 голосов
/ 16 сентября 2010

Вы не создали экземпляр SubReportsList перед вызовом Add.Выполните следующие действия перед добавлением mySubReport:

thisReport.SubReportsList = new List<SubReport>();
thisReport.SubReportsList.Add(mySubReport);

Вы также можете изменить свойство SubReportsList, чтобы упростить свою жизнь:

public class Report
{
    public IList<SubReport> SubReportsList
    {
        get
        {
            if (_subReportsList == null)
            {
                _subReportsList = new List<SubReport>();
            }
            return _subReportsList;
        }
    }
    private IList<SubReport> _subReportsList;
}

Выполнение этого приведет к созданию экземпляра вашего списка, если он вызывается во время вызоваэто ноль.

2 голосов
/ 16 сентября 2010

Вы, вероятно, должны сначала сделать:

thisReport.SubReportsList = new List<SubReport>();
1 голос
/ 16 сентября 2010

Поскольку @GenericTypeTea и @Dan Dumitru уже предоставили хорошие ответы, я просто добавлю, что можно «автоматически» сделать это, добавив неявную конструкцию, если значение равно нулю при вызове свойства. Вы можете сделать это, если вы не используете авто-свойства ala:

public class Report {
 // ... other code ...
 private List<SubReports> _subReports = null;

 public List<SubReport> SubReports {
    get {
      if (_subReports == null) { _subReports = new List<SubReports>(); }
      return _subReports;
    }
 }
}

Следует отметить некоторые оговорки, например, сделать их поточно-ориентированными (это не имеет смысла), но базовая реализация будет работать для вас. Я был бы осторожен при использовании этого дизайна, так как он может вызвать создание объектов, которые вам не обязательно нужны, просто проверяя свойства. Если это нежелательно, придерживайтесь рекомендаций, рекомендованных выше.

1 голос
/ 16 сентября 2010

thisReport.SubReportsList - ваша нулевая ссылка;Вы объявили это, но не инициализировали это.Вы можете инициализировать его (возможно, с новым экземпляром) либо в конструкторе для типа thisReport, либо непосредственно перед тем, как начать добавлять в него элементы.

1 голос
/ 16 сентября 2010

Это должно быть SubReportsList, то есть ноль.

0 голосов
/ 16 сентября 2010

Обязательно инициализируйте список с помощью ключевого слова new. В противном случае сам список будет нулевым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...