执行此程序时出现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();
答案 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名学生。