2010-06-21 88 views
1

我在C#中有此代碼。 它返回「未設置對象實例的對象引用」異常。C#List +未將對象引用設置爲對象的實例

代碼:

public decimal Calculate(String id) 
    { 
     decimal Total=0; 
     AmountDataDB getData=new AmountDataDB(); 
     List<AmountData> d = new List<AmountData>(); 
     d = getData.Amount_Details(id); 
     if (d.Capacity != 0) 
     { 
      foreach (AmountData temp in d)//NullReference exception occurs here 
      { 
       Total += temp.Amount; 
      } 

     } 
     return Total; 
    } 

這裏,AmountDataDB和AmountData兩類。 Amount_Details返回一個類型爲AmountData的列表。

+1

你AmountData對象可能是NULL。檢查它 – 2010-06-21 11:10:13

+2

你是否正面,Amount_Details不返回空? – Rup 2010-06-21 11:10:47

+1

如果它返回null,那麼'if(d.capacity ...)'應該拋出異常 – cjk 2010-06-21 11:15:48

回答

1

getData.Amount_Details(id);返回null,可能是因爲該特定ID沒有記錄。如果沒有記錄,您可能應該更改Amount_Details()的行爲以返回空列表而不是null。

+0

當他在下一行的空引用上調用容量時,肯定會崩潰,而不是在foreach上? (同意這個建議,但是永遠不會返回null收藏!) – 2010-06-21 11:16:47

+0

嗯,你是對的。要麼它必須發生在條件或在foreach塊(因爲要麼d或臨時爲空),而是在foreach-decleration? HM。 – Femaref 2010-06-21 11:38:20

+0

有沒有什麼方法可以使Amount_Details的結果成爲重寫GetEnumerator()方法的'List <>'的子類?我不會認爲這是可能的,但我不能認爲在每條線上會發生什麼。 – Rup 2010-06-21 12:07:19

4

非應答(建議):

請,請X 100000,難道沒有寫這樣的代碼:

List<AmountData> d = new List<AmountData>(); 
d = getData.Amount_Details(id); 

這是完全沒有意義的創建一個新的名單隻有把它在未來覆蓋線。

4

您可以使用null-coalescing operator以確保d變量永遠不能爲null:在您的列表

List<AmountData> d = getData.Amount_Details(id) ?? new List<AmountData>(); 
相關問題