执行此程序时出现空异常错误。尽管我已经初始化了数组
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();发布于 2015-02-03 11:21:55
尽管您没有很好地指出错误发生的确切位置,但是您发布的代码初始化了arr[0]和arr[1],但从未初始化arr[2]。
因为您分配了一个具有三个元素的数组,所以最后可以从您的循环访问这三个元素。
因此,当您尝试访问最后一个元素的属性时,我预计会出现一个空引用异常。
发布于 2015-02-03 11:26:12
您的数组大小为3,但您仅将2个元素初始化为数组。虽然arr和arr1中存在元素,但arr2会返回空引用,因为您没有在其中初始化任何数据。您可以使用以下命令将数据添加到arr2或将数组大小更改为2
student[] arr = new student[2]
发布于 2015-02-03 11:33:48
您之所以获得NullReferenceException,是因为您试图访问循环中一个空学生的属性(您只初始化了前两个,而没有初始化最后一个)。
避免此异常的一种方法是在循环中执行null检查,因此如果您尚未初始化某些项,则仍然可以输出已初始化的学生的姓名:
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设置一些默认值,这样如果没有设置,您仍然可以显示一些内容(比如"No Name"),您还可以重写ToString()方法,以便学生类知道如何正确地显示自己。而且,在C#中,类和公共属性通常是PascalCase:
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));
}
}有了这些,你就可以做一些更简单的事情了,比如:
foreach (student i in arr.Where(s => s != null))
{
Console.WriteLine(i);
}https://stackoverflow.com/questions/28290757
复制相似问题