解析float时的C#空引用

时间:2012-10-18 20:10:07

标签: c# asp.net

我在下面有以下代码。哪个效果很好,我希望允许MaxDemand为空值。但是,因为我正在解析一个字符串,所以如果我没有放入一些值,那么它似乎是错误的。

异常详细信息: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();
}

3 个答案:

答案 0 :(得分:1)

如何使用可空类型并检查e.NewValues [Key]不为空

float? MaxDemand;

然后

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

答案 1 :(得分: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;

     ...

答案 2 :(得分: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;