2013-12-09 120 views
0

我找不出爲什麼我得到這個錯誤。我正在爲我嘗試創建的對象設置一個實例。任何幫助將非常感激。我將發佈我的表單代碼,然後發佈下面的類代碼。該應用程序運行良好,當我點擊btnAdd時,它只是給我那個空引用錯誤。C#System.NullReferenceException {「對象引用未設置爲對象的實例。」}

public partial class frmProperties : Form 
{ 
    Agent curAgent; 
    PropertyCollection pc; 
    int currRecord; 

    public frmProperties() 
    { 
     InitializeComponent(); 
    } 

    public frmProperties(Agent ac, PropertyCollection pcPassed) 
    { 
     InitializeComponent(); 
     curAgent = ac; 
     pc = pcPassed; 
    } 

    //check if there is a property in the list 
    private void frmProperties_Load(object sender, EventArgs e) 
    { 
     if (curAgent.AgentPropertyList.Count > 0) 
      ShowAll(); 
    } 

    private void btnNext_Click(object sender, EventArgs e) 
    { 
     if (currRecord < curAgent.AgentPropertyList.Count - 1) 
     { 
      currRecord++; 
      ShowAll(); 
     } 
     else MessageBox.Show("No more properties to view"); 
    } 

    void ShowAll() 
    { 

     txtId.Text = curAgent.AgentPropertyList[currRecord].ToString(); 
     Property p = pc.FindProperty(curAgent.AgentPropertyList[currRecord]); 
    } 

    private void btnShowPrev_Click(object sender, EventArgs e) 
    { 
     if (currRecord > 0) 
     { 
      currRecord--; 
      ShowAll(); 
     } 
     else MessageBox.Show("No more properties to view"); 
    } 

    private void btnAdd_Click(object sender, EventArgs e) 
    { 
     pc.AddProperty(Convert.ToInt32(txtId.Text), txtAddress.Text, Convert.ToInt32(txtBedrooms.Text), txtType.Text, Convert.ToInt32(txtSqFt.Text), Convert.ToDouble(txtPrice.Text), txtAgent.Text); 
    } 

    private void btnExit_Click(object sender, EventArgs e) 
    { 
     this.Close(); 
    }  
} 

下面是代碼的類,它的add函數是在創建:

public class PropertyCollection 
{ 
    // list of properties 
    List<Property> propertyList = new List<Property>(); 

    public List<Property> PropertyList 
    { 
     get { return propertyList; } 
     set { propertyList = value; } 
    } 

    public void AddProperty(int id, string address, int bedrooms, string type, int sqft, double price,string agent) 
    { 
     Property p = new Property(id,address,bedrooms,type,sqft,price,agent); 
     propertyList.Add(p); 
    } 

    public void RemoveProperty(int id) 
    { 
     Property rem = new Property(id); 
     propertyList.Remove(rem); 
    } 

    //loop through and find equivalent 
    public Property FindProperty(int id) 
    { 
     Property find = new Property(id); 
     for (int i = 0; i < propertyList.Count; i++) 
      if (propertyList[i].Equals(find)) 
       return propertyList[i]; 
     return null; 
    } 

    //Count property and INDEXER 
    public int Count 
    { 
     get { return propertyList.Count; } 
    } 

    public Property this[int i] 
    { 
     get { return propertyList[i]; } 
     set { propertyList[i] = value; } 
    } 
} 
+0

你有兩個構造函數,一個是空的,一個是args,空的調用是args。然後檢查pcPassed是否爲空,如果是,則初始化它的一個新實例。 – Sorceri

+6

因此,當你在斷開的線上放置一個斷點並檢查了變量時,哪一個爲空? –

+0

由於Sorceri概述的原因,「pc」並不總是被初始化。 – Chris

回答

0

您的默認構造函數初始化沒有電腦;你可以將其更改爲以下內容:

public frmProperties() 
{ 
    InitializeComponent(); 
    pc = new PropertyCollection(/* any params here */); 

} 
0

我張貼這是我在5個upticks或多或少peaved檢查斷點,因爲它顯示了評註者沒有閱讀的問題。

發佈聲明接收System.NullReferenceException在btnAdd_Click方法

所以,我們看一下這個方法,當點擊{「未將對象引用設置到對象的實例。」},它表明我們只訪問1個變量命名爲pc。該錯誤告訴我們我們有一個尚未初始化的對象。所以我們期待看看變量是否定義,當然是。現在我們看看在哪裏初始化,讓我們看看構造函數。

//this constructor does not initialize any variables, just the form 
public frmProperties() 
{ 
    InitializeComponent(); 
} 

//this constructor initializes the variables but does not check for null 
public frmProperties(Agent ac, PropertyCollection pcPassed) 
{ 
    InitializeComponent(); 
    curAgent = ac; 
    pc = pcPassed; 
} 

所以我們有兩個問題可能導致進行異常。
1)默認的構造函數被調用,因此pc從不初始化 2)第二個構造函數被調用,pcPassed的值爲null。

所以要解決這個問題,我們可以刪除第一個構造函數,要求傳入參數以啓動窗體,然後我們只需要檢查變量上的空值。或者保留默認的構造函數,並調用正確的默認值或者null值,我建議使用這種方式,所有處理都是在構造函數中用args完成的。因此,解決將是

//default constructor calling the correct constructor with params. 
public frmProperties() :this(null,null) { } 


public frmProperties(Agent ac, PropertyCollection pcPassed) 
{ 
    InitializeComponent(); 
    if(ac != null) //check for null values 
     curAgent = ac; 
    else 
     curAgent = new Agent(); 
    if(pcPassed != null)//check for null values 
     pc= pcPassed; 
    else 
     pc = new PropertyCollection(); 

} 

因此,在短期你不需要斷點,你已經知道該對象未初始化因爲這是異常告訴你。

+0

我想起了當初評議真的意思是 - 使用調試器來查明 – pm100

相關問題