2012-10-18 22 views
1

我在下面有下面的代碼。這是很好的期望,我想讓MaxD​​emand成爲一個空值。但是因爲我解析一個字符串,如果我沒有放入某個值,它似乎會出錯。C#解析浮動時的空引用

異常詳細信息:System.NullReferenceException:未將對象引用設置爲對象的實例。

什麼是實現錯誤處理解決方案的最佳解決方案?我嘗試了float.TryParse,但無法讓它工作。

謝謝你關注我的問題。

protected void GridView3_RowUpdating(object sender, GridViewUpdateEventArgs e) 
    { 
    float Cost = 0.0F; 
    float Consumption = 0.0F; 
    int InvoiceID = 0; 
    float MaxDemand = 0.0F; 
    DateTime ServiceFrom = new DateTime(); 
    DateTime ServiceTo = new DateTime(); 

    foreach (string key in e.NewValues.Keys) 
     switch (key) 
     { 
      case "TotalInvoice": Cost = float.Parse(e.NewValues[key].ToString()); 
           break; 
      case "EnergyInvoiceID": InvoiceID = int.Parse(e.NewValues[key].ToString()); 
           break; 
      case "Consumption": Consumption = float.Parse(e.NewValues[key].ToString()); 
           break; 
      case "ServiceFrom": ServiceFrom = DateTime.Parse(e.NewValues[key].ToString()); 
           break; 
      case "ServiceTo": ServiceTo = DateTime.Parse(e.NewValues[key].ToString()); 
           break; 
      case "MaxDemand": MaxDemand = float.Parse(e.NewValues[key].ToString()); 
           break; 
     } 

    UpdateInvoice(InvoiceID, Cost, Consumption, ServiceFrom, ServiceTo, MaxDemand); 
    GridView3.EditIndex = -1; 
    PopulateAccountHistory(); 
} 
+5

你的問題很可能是那些e.NewValues的一個[關鍵]被返回null和的ToString()對空值調用時調用失敗,但我正在猜測;如果你可以發佈異常的堆棧跟蹤,它可能會清除 –

回答

1

這裏的問題是不實際解析floatdouble的值。如果失敗了,它會返回一個更具體的異常。看來,問題是e.NewValues[key]的回報之一返回null和你扔在調用ToString

這將是最好在循環的開始,集中處理null檢查。它也可以讓你刪除重複呼叫到e.NewValues[key]

foreach (string key in e.NewValues.Keys) { 
    var value = e.NewValues[key]; 
    if (value == null) { 
     continue; 
    } 

    var str = value.ToString(); 
    switch (key) { 
    case "TotalInvoice": 
     Cost = float.Parse(str); 
     break; 

    ... 
+0

感謝JaredPar解釋我的問題,並告訴我如何解決它。這真的幫助和解決了我的問題!我欠你一杯啤酒! – Zach

1

如何使用可空類型,並檢查e.NewValues [關鍵]不爲空

float? MaxDemand; 

然後

case "MaxDemand": 
{ 
    if(e.NewValues[key] != null) 
    { 
    MaxDemand = float.Parse(e.NewValues[key].ToString()); 
    } 
    break; 
} 
0

從我NullableExtensions

public static T? Parse<T>(object obj) 
    where T : struct 
{ 
    if (obj == null) return null; 
    try 
    { 
     return (T)System.Convert.ChangeType(obj, typeof(T)); 
    } 
    catch (FormatException) { return null; } 
    catch (InvalidCastException) { return null; } 
} 

case "TotalInvoice": Cost = NullableExtensions.Parse<float>(e.NewValues[key]); break; 
+1

你不需要在該方法簽名中的「where T:struct」嗎? – JaredPar

+0

是的。由於某種原因,我在格式化時刪除了它。 –