首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >初始化数组后出现空引用异常

初始化数组后出现空引用异常
EN

Stack Overflow用户
提问于 2015-02-03 11:16:33
回答 5查看 1K关注 0票数 0

执行此程序时出现空异常错误。尽管我已经初始化了数组

代码语言:javascript
复制
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();
EN

回答 5

Stack Overflow用户

发布于 2015-02-03 11:21:55

尽管您没有很好地指出错误发生的确切位置,但是您发布的代码初始化了arr[0]arr[1],但从未初始化arr[2]

因为您分配了一个具有三个元素的数组,所以最后可以从您的循环访问这三个元素。

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

票数 1
EN

Stack Overflow用户

发布于 2015-02-03 11:26:12

您的数组大小为3,但您仅将2个元素初始化为数组。虽然arr和arr1中存在元素,但arr2会返回空引用,因为您没有在其中初始化任何数据。您可以使用以下命令将数据添加到arr2或将数组大小更改为2

student[] arr = new student[2]

票数 1
EN

Stack Overflow用户

发布于 2015-02-03 11:33:48

您之所以获得NullReferenceException,是因为您试图访问循环中一个空学生的属性(您只初始化了前两个,而没有初始化最后一个)。

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

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

您还可以仅显示实际具有名称的学生(通过检查是否为空名称),如下所示:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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));
    }
}

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

代码语言:javascript
复制
foreach (student i in arr.Where(s => s != null))
{
    Console.WriteLine(i);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28290757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档