2013-12-09 73 views
0

爲了學習的目的,我設置了一個方法來調用另一個方法來顯示我通過用戶輸入定義的值。然而,我最終得到一個討厭的錯誤:C#新手 - 嵌套方法又一個System.NullReferenceException - 對象錯誤

System.NullReferenceException - Object reference not set to an instance of an object

可能有人請解釋一下我在做什麼引起的錯誤;並且在不改變代碼的情況下進行這項工作(保留嵌套方法)。

的Program.cs

namespace Test 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Parent theParent = new Parent(); 

      Console.WriteLine("Enter Child Name:"); 
      string input = Console.ReadLine(); 
      theParent.Child.Name = input; 

      theParent.FirstMethod(); 
      Console.ReadLine(); 
     } 
    } 
} 

Parent.cs

namespace Test 
{ 
    class Parent 
    { 
     public Child Child = new Child(); //I changed this line. It was originally only 'public Child Child' 

     public void FirstMethod() 
     { 
      Child newChild = new Child(); 
      newChild.SecondMethod(); 
     } 
    } 
} 

Child.cs

namespace Test 
{ 
    class Child 
    { 
     private string name; 

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

     public void SecondMethod() 
     { 
      Parent theParent = new Parent(); 
      Console.WriteLine(theParent.Child.Name.ToString()); 
     } 
    } 
} 

回答

1

您的Childnull

首先創建一個新的Parent

Parent theParent = new Parent(); 

這有publicchild(注:使用屬性,而不是公共領域):

public Child Child; 

正如你可以看到:這沒有證據。

然後你使用這個孩子:

theParent.Child.Name = input; 

childnull!因此,NullReferenceException

你必須instante的child領域:

public Child Child = new Child(); 

或者在另一個地方,那是給你的。

有關公共字段的旁註:您通過提供對實例成員的直接訪問來打破封裝。您應該使用getters & setter(在C#中方便地由屬性提供)。

新情況:

void Main() 
{ 
    Parent theParent = new Parent(); 
    string input = "jack"; 
    theParent.Child.parent = theParent; // ADD THIS 
    theParent.Child.Name = input; 

    theParent.FirstMethod(); 
} 

class Parent 
    { 
     public Child Child = new Child(); //I changed this line. It was originally only 'public Child Child' 

     public void FirstMethod() 
     { 
     // Child.parent = this; // REMOVE THIS 
      Child.SecondMethod(); 
     } 
    } 

class Child 
{ 
    public Parent parent; 
    private string name; 

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

    public void SecondMethod() 
    { 
     Console.WriteLine(parent.Child.Name); 
    } 
} 

輸出:

jack

+0

謝謝。當我把「公共兒童兒童」改爲「公共兒童兒童=新兒童()」時,那照顧了一個錯誤。但是,也有同樣的錯誤消息抱怨線「Console.WriteLine(theParent.Child.Name.ToString());」在Child.cs – MKANET

+0

@MKANET:嘗試刪除'.ToString()'。 'Name'已經是'string'了,所以它不應該有所作爲。但是如果'string'是'null',它會拋出一個NullReferenceException。 –

+0

我已經試過了。字符串是空白的。它不會顯示給Parent.Child.Name的值(來自之前的用戶輸入)。 – MKANET

4

引用類型(類)是初始化爲null。在你Parent類型,你聲明Child這樣的:

public Child Child; 

這使得Childnull。您需要內聯初始化..或將其設置在構造函數中:

public Child Child = new Child(); 

......或者......

public Parent() { 
    Child = new Child(); 
} 

..或者甚至在線聲明Parent對象時:

Parent theParent = new Parent() { Child = new Child() }; 

與其他任何此類相同。

+0

感謝。當我把「公共兒童兒童」改爲「公共兒童兒童=新兒童()」時,那照顧了一個錯誤。但是,也有同樣的錯誤消息抱怨線「Console.WriteLine(theParent.Child.Name.ToString());」在Child.cs – MKANET

+0

@MKANET把你在'Parent'中學到的東西應用到'Child'。如果'Parent.Child'開始爲null,直到你將它設置爲一個值,你認爲'Child.Name'發生了什麼? –