2012-10-23 30 views
1

我最近開始嘗試自學C#,這是一個初學者嘗試在屬性中使用業務規則的實現,在我的情況下是FurColor。當我運行下面的程序時,我得到一個NullReferenceException。有人能幫我找到這個錯誤的原因嗎?唯一的例外在線15雖然while屬性中的循環導致堆棧

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

namespace _10_23_Test 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("programming practice!"); 
      Dog d = new Dog(); 
      Console.Write("what color is your dog: "); 
      d.FurColor = Console.ReadLine(); 
      Console.WriteLine("the color of your dog is {0}", d.FurColor); 
     } 
    } 
    class Dog 
    { 
     private string furColor; 
     private string petName; 
     private int tagNum; 

     public Dog() { } 

     public Dog(string color, string name, int tagID) 
     { 
      furColor = color; 
      petName = name; 
      tagNum = tagID; 
     } 
     //properties 
     public string FurColor 
     { 
      get { return furColor; } 
      set {      
        do 
        { 
         Console.Write("enter in a viable color type: "); 
        } 
        while (furColor.Length > 10); 
        furColor = value; 
       } 
     } 
     public string Name 
     { 
      get { return petName; } 
      set { petName = value; } 
     } 
     public int TagNum 
     { 
      get { return tagNum; } 
      set { tagNum = value; } 
     } 

    } 
} 
+1

你會得到什麼樣的例外? –

+0

@ DanielA.White 15 – wootscootinboogie

+1

你沒有在'FurColor'的循環中分配任何東西。 –

回答

2

一旦糾正,你將會得到一個無限循環。

備註:您不應該在您的財產的Set子句中要求輸入。

你應該更喜歡一個會請求輸入的成員函數,檢查它是否有效,然後設置顏色。

在你的狗類添加一個功能,看起來像這樣:

public void setFurColor() 
{ 
    string color = string.Empty; 
    do 
    { 
     Console.Write("what color is your dog: "); 
     color = Console.ReadLine(); 
    }while (! string.IsNullOrEmpty(color) && bleh.Length < 10); 
    this.furColor = color; 
} 
+0

我會記住這一點。謝謝。這只是在我編造的場景中突然出現在我的腦海中。 – wootscootinboogie

+0

主要問題是您沒有機制重新分配循環中的值,所以這會產生無限循環。 –

+0

我的印象是,不應該使用getter或setter方法,而應該使用屬性。如果存在簡單的業務邏輯而不是自動屬性,應該使用getter和setter方法嗎? – wootscootinboogie

1

檢查furColor對空時訪問其furColor.Length

1

你的代碼沒有任何意義之前,但它是好的,因爲你正在學習如何編寫代碼。 :)

所以 - 我想你只想存儲furColor只有當用戶輸入的字符串長度超過10個字符。如果是這樣,在將值賦給對象屬性之前,應該檢查字符串是否正確,如果不是,則在類屬性代碼的外部使用警告消息循環。

+0

當我正在閱讀參考書和尋找和他們的程序,它使世界上的所有感。當我試圖把自己的東西放在一起而沒有看任何東西時......那是一個不同的故事 – wootscootinboogie

+1

那麼,那種感覺就是這樣。它會解決,一旦你嘗試失敗約100次:) –

1

爲了使你有工作的代碼:你正在訪問furColor.Length,而沒有設置furcolor ...在這一點上什麼都沒有(null)。你應該檢查value

此外,這不是你想要在屬性上設置一個邏輯。你的二傳手不應該輸出一個閱讀值,它應該簡單地設置它的屬性。把while循環放在你的main中。

1

您正在使用狗

public Dog() { } 

的公共參數的構造函數,此構造不設置furColor場,所以它將在您的Dog實例中爲空。

這意味着訪問以下行中的furColor字段的Length屬性將引發NullReferenceException。你可以得到這個異常各地

while (furColor.Length > 10); 

的方法之一,是通過在參數的構造函數設置默認值的那些領域,比如:

public Dog() : this("brown", "Fido", default(int)) 
{ 
} 

或者,您可以:

  • 使用帶參數的構造函數,爲furColor傳入非空值。
  • 檢查FurColor屬性設置器中的空值。
  • 在聲明的地方設置field
1

您的furColor變量在訪問其長度之前需要根據空值進行分配和/或檢查。由於您使用的是默認構造函數,因此您永遠不會分配給furColor字符串。 你會想從默認打電話給你的其他的構造函數:

public Dog() : this("defaultColor", "defaultName", default(int)) {} 

話雖這麼說,這不是良好的編程習慣一個屬性中要求用戶輸入,你會落得一個無限循環與你的財產。