2014-08-29 64 views
-1

我有这样的代码:无法克服System.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; 
     } 
    } 
} 

这个类也是我的命名空间第11章

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

     private sequence() 
     { } 

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

我的目标是创建10个对象 - 猫(类型),并给它们起名称像CatN,其中N是它们的编号。

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

在主要功能我想创建数组类型Cat和for循环给这10个索引数组中的每个元素名称CAT +它的数字由序列。

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

我在MSDN阅读,但没有得到足够的东西来解决这个问题。 (f11)​​调试模式,似乎一切都很好,但当它开始读取与“cats [i] .Name =”Cat“+ sequence.NextValue();”可以继续,只是坚持它,编译器无法继续前进。我在我的数组中看到这个索引是空的,我不确定,但它可能是问题。

任何人都可以告诉我该怎么做对吗?

我想这是一个讨厌和无聊的问题,但我是新手,必须通过这个,所以请不要讨厌这个职位。

+1

'Cat'是'class','class'是一个引用类型。引用类型用'null'值初始化。一个引用类型的数组将是一个'null'值的数组。所以对于每个'猫',你需要一个'新猫'。 – crashmstr 2014-08-29 17:33:36

回答

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(); 
} 

当您创建数组它不会自动实例化(创建)新对象。你需要专门告诉它这样做。

+0

谢谢你快速回答! – 2014-08-29 17:39:13

+0

@StoyanPetkov请务必将最有帮助的回复标记为答案(您可能需要等待几分钟) – MikeH 2014-08-29 17:40:42

0

​​是null由于对象构造函数会将默认值放在每个新插槽中......对于引用类型为空。您不能引用空对象的.Name

创建您的猫对象作为一个整体并将其作为一个整体插入。

更新的代码会喜欢什么样:

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

感谢您的帮助! – 2014-08-29 17:57:22

0

必须先创建你的猫对象。与此更换您的for循环:

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

感谢您的答案! – 2014-08-29 17:59:14

1

当你创建猫的数组

Cat[] cats = new Cat[10]; 

你只是创建它可以包含猫的数组。但目前还没有任何实际猫在那里,除非你把它们放在

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

在这里你问阵列中的“第i个”项目 - 这是空(在那里没有猫),并试图用null做一些事情。这是什么导致你的问题。

你需要真正把猫放在第一位。

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

非常感谢您的快速回答! – 2014-08-29 17:38:53

0

您还没有创建一个对象cat。 数组初始化为空值,因为Cat是引用类型。

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

我完成了,感谢您的帮助:) – 2014-08-29 18:00:03