初始化数组后获取null引用异常

时间:2015-02-03 03:16:33

标签: c# arrays nullreferenceexception

执行此程序时出现null异常错误。虽然我已初始化数组

public class student
{
    string name;

    public string _name
    {
        set
        {

            this.name = value;
        }
        get
        {
            return name;
        }
    }
    public int _marks{  set; get; }
}

student[] arr = new student[3];

arr[0] = new student();
arr[0]._name = "AB";
arr[0]._marks = 44;

arr[1] = new student();
arr[1]._name = "amla";
arr[1]._marks = 75;


foreach (student i in arr)
{
    Console.WriteLine("\nname:{0}\nmarks:{1}", i._name, i._marks);
}
Console.Read();

5 个答案:

答案 0 :(得分:1)

虽然您没有很好地指出错误发生的确切位置,但您发布的代码已初始化为arr[0]arr[1],但从未初始化arr[2]。< / p>

由于您分配了一个包含三个元素的数组,因此最后三个元素都可以从您的循环中访问。

因此,当您尝试访问最后一个元素的属性时,我会期望一个空引用异常。

答案 1 :(得分:1)

您的数组大小为3,但您只为该数组初始化了2个元素。虽然arr [0]和arr [1]中存在元素,但是arr [2]返回空引用,因为没有在那里初始化数据。您可以将数据添加到arr [2]或使用

将数组大小更改为2

student[] arr = new student[2]

答案 2 :(得分:1)

您正在获取NullReferenceException,因为您正在尝试访问循环中空学生的属性(您只初始化了前两个,但不是最后一个)。

避免此异常的一种方法是在循环中进行空检查,因此如果您尚未初始化某些项目,您仍然可以输出已初始化的学生的姓名:

foreach (student i in arr.Where(s => s != null))
{
    Console.WriteLine("\nname:{0}\nmarks:{1}", i._name, i._marks);
}

您也可以只显示实际拥有姓名的学生(通过检查空名称),如:

foreach (student i in arr.Where(s => s != null && s._name != null))
{
    Console.WriteLine("\nname:{0}\nmarks:{1}", i._name, i._marks);
}

但实际上这样的事情应该可以在学生班上完成,所以客户不必这样做。您可以考虑在学生班级中为name设置一些默认值,因此如果没有设置,您仍然可以显示某些内容(例如&#34; No Name&#34;),您也可以覆盖{{1方法,以便学生类知道如何正确显示自己。而且,当你在它的时候,类和公共属性通常是C#中的PascalCase:

ToString()

有了这个,你可以做一些更简单的事情:

public class Student
{
    private string _name;

    public string Name
    { 
        get { return _name; } 
        set { if (value != null) _name = value; }
    }

    public int Marks { get; set; }

    public Student()
    {
        Name = "<No Name>";
    }

    public override string ToString()
    {
        return string.Format("{3}Name:{0}{3}Marks:{1}", 
            Name, Marks, Environment.NewLine));
    }
}

答案 3 :(得分:0)

尝试更改数组的大小:

student[] arr = new student[2];

答案 4 :(得分:0)

你有一个大小为3的数组,但你只添加了2个元素。

更改

student[] arr = new student[3];

student[] arr = new student[2];

这是因为您尝试在尚未初始化时访问student类的成员。

你可以像我上面所说的那样做,或者添加第3名学生。