无法克服System.NullReferenceException

时间:2014-08-29 17:32:09

标签: c# nullreferenceexception

我有这段代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Zad_8.Chapter11
{
    class Program
    {
        static void Main(string[] args)
        {
             Cat[] cats = new Cat[10];
             for (int i = 0; i < 10; i++)
             {
                 cats[i].Name = "Cat " + sequence.NextValue();
             }

            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(cats[i].Name);
            }
        }
    }
}

这是我的命名空间第11章

中的类
namespace Zad_8.Chapter11
    {
         public class Cat
        {
        private string name = "Cat";
        private string color;

         public string Name
        {
            get { return this.name; }
            set { this.name = value; }
        }

        public Cat(string name)
        {
            this.name = name;
        }
    }
} 

这个类也在我的命名空间Chapter11

namespace Zad_8.Chapter11
{
    public class sequence
    {
         private static int current = 0;

         private sequence()
        { }

    public static int NextValue()
       {
        current++;
        return current;
       }
    }
}

我的目标是创建10个对象 - 猫(类型)并给它们命名为CatN,其中N是它们的数字。

我有类Cat + name属性+ get和set。 我有班级序列,它会给我1到10的数字

在Main函数中我想创建数组类型Cat并使用for循环来给出这10个索引数组中的每个元素名称CAT +它的序列号。

我的错误列表中没有错误,我尝试过很多东西,比如只打印10次Cat等..但每次它都会抛出这个异常'System.NullReferenceException。

我在MSDN中读过,但没有得到足够好的东西来克服这个问题。

我也尝试了(f11)​​调试模式,似乎一切都很好但是当它开始用“cat [i] .Name =”Cat“+ sequence.NextValue();” 可以继续前进并坚持下去,编译器无法继续前进。我在我的数组中看到这个索引是null并且我不确定但它可能是问题。

谁能告诉我该怎么做?

我想这是一个令人烦恼和无聊的问题,但我是新手并且必须通过这个,所以请不要讨厌这个帖子。

5 个答案:

答案 0 :(得分:1)

当你创建一系列猫

Cat[] cats = new Cat[10];

你只是创建一个可以包含猫的数组。但除非你把猫放进去,否则实际上并没有猫。

cats[i].Name = "Cat " + sequence.NextValue();

在这里你要求数组中的'ith'项 - 它是null(没有猫在那里)并试图用null做一些事情。这是造成问题的原因。

你需要先把猫放在第一位。

    cats[i] = new Cat("Cat " + sequence.NextValue());

答案 1 :(得分:1)

改变这个:

Cat[] cats = new Cat[10];
for (int i = 0; i < 10; i++)
{
  cats[i].Name = "Cat " + sequence.NextValue();
}

到此:

Cat[] cats = new Cat[10];
for (int i = 0; i < 10; i++)
{
  cats[i] = new Cat(); //<------This line is new
  cats[i].Name = "Cat " + sequence.NextValue();
}

创建数组时,它不会自动实例化(创建)新对象。你需要具体告诉它这样做。

答案 2 :(得分:0)

cats[i]null,因为对象构造函数会将默认值放在每个新槽中......对于引用类型,它是null。您无法引用空对象的.Name

创建整个cat对象并将其整体插入。

您的更新代码是什么样的:

cats[i] = new Cat("Cat " + sequence.NextValue());

答案 3 :(得分:0)

必须先创建您的Cat对象。用这个替换你的for循环:

for (int i = 0; i < 10; i++)
{
     cats[i] = new Cat("Cat " + sequence.NextValue());
}

答案 4 :(得分:0)

您尚未创建Object cat。 您使用空值初始化数组,因为Cat是引用类型。

Cat[] cats = new Cat[10];
for (int i = 0; i < 10; i++)
{
    cats[i] = new Cat("Cat " + sequence.NextValue());
}