类中的clss,null引用异常,C#

时间:2012-03-23 18:20:26

标签: c#

我的班级看起来像这样。

public class LogSettings
{
    public string attributeName { get; set; }//TODO: change the variable name

    public Warnings[] warnings = new Warnings[3];
}

public class Warnings
{
   public string typeOfWarning {get; set;}

    public bool isAbsolute { get; set; }

    public decimal numUpDownValue { get; set; }

    public LogSettingActions[] actionItems = new LogSettingActions[10];
}

public class LogSettingActions
{
    public string actionItem{ get; set;}
}

但是当我尝试创建Warnings实例时,它会抛出NullReference错误。

var rows = FindChilds<ctlLogConfigRow>(lvLogConfigTemplate);
foreach (var row in rows)
{
    LogSettings instance = new LogSettings();
    instance.attributeName = row.GroupHeaderText;

    var allWarnings = FindChilds<ctlWarnings>(row);

    for (int i = 0; i < allWarnings.Count; i++)
    {

       instance.warnings[i].typeOfWarning = allWarnings[i].ctlWarningGroupBoxFixedHeader1.Header.ToString();//It throws error here

有人能帮助我吗?

5 个答案:

答案 0 :(得分:5)

LogSettings.warnings初始化为数组,但数组元素未初始化。

考虑在LogSettings构造函数中初始化数组项:

public class LogSettings
{
    public LogSettings()
    {
         warnings = new Warnings[3];
         for (int i=0; i<warnings.Length; i++)
         {
              warnings[i] = new Warnings();
         }
    }

    public string attributeName { get; set; }//TODO: change the variable name

    public Warnings[] warnings;
}

答案 1 :(得分:2)

此行不会创建任何警告对象:

public Warnings[] warnings = new Warnings[3];

数组中的所有引用都初始化为null。在尝试访问这些对象的任何属性之前,您需要先实际创建一些对象:

for (int i = 0; i < warnings.Length; ++i) {
    warnings[i] = new Warnings();
}

答案 2 :(得分:1)

执行此操作时:

public Warnings[] warnings = new Warnings[3];

您创建一个包含3个警告对象空间的数组(或者更确切地说是对它们的引用)。它实际上并不创建警告。在此行之后,警告[0]为空,与所有其他行一样。

答案 3 :(得分:0)

在日志设置中,您初始化警告数组,但不是数组的元素。您需要初始化每个元素。

 for (int i=0;i<3;i++)
     warning[i] = new Warning();

答案 4 :(得分:0)

该行:

public Warnings[] warnings = new Warnings[3];

仅创建数组,而不是数组中的对象。要在数组中创建Warnings的实例,请执行以下操作:

public Warnings[] warnings = 
    Enumerable.Repeat<Warnings>(new Warnings(), 3).ToArray();

与之相同:

public LogSettingActions[] actionItems = 
    Enumerable.Repeat<LogSettingActions>(new LogSettingActions(), 10).ToArray();

得爱LINQ。