【问题标题】:Adding list in list在列表中添加列表
【发布时间】:2013-05-02 10:48:54
【问题描述】:

我有类 SellStatement

public class SellStatement
{
    public long billNo
    public DateTime paymentDate;
    public List<string>  ProductName;
    public List<double> quantity;
    public List<double> ratePerQuantity;
}

当我尝试访问 GetSaleDetails 函数时

public Exception GetSaleDetails(List<SellStatement> lss1,string query)
    {
        try
        {
            for (int i = 0; i < lss1.ToArray().Length; i++)
            {
                query = "select * from [product details] where [bill no]=@billno";
                com = new SqlCeCommand(query, con);
                con.Open();
                com.Parameters.AddWithValue("@billno",lss1[i].billNo);
                sdr = com.ExecuteReader();
                while (sdr.Read())
                {
                    lss1[i].ProductName.Add(sdr.GetString(1));//Exception line
                    lss1[i].quantity.Add(sdr.GetDouble(2));
                    lss1[i].ratePerQuantity.Add(sdr.GetDouble(3));       
                }
            }
            con.Close();
            return null;
        }
        catch (Exception e)
        {
            con.Close();
            return e;
        }
    }

lss1[i].ProductName.Add(sdr.GetString(1)); 出现空引用异常。我认为错误可能是因为sdr.GetString(1) 中的空值,但我检查了它有一些值。我的朋友告诉我,你不能像这样更改函数参数值所以我尝试像这样将一个列表复制到另一个列表。

 List<SellStatement> lss1 = new List<SellStatement>() ;
            lss1.AddRange(lss);

但这对我没有帮助。添加元素时我无法弄清楚出了什么问题。

【问题讨论】:

  • 你需要学习如何处理异常...
  • 请告诉我这段代码有什么问题。
  • 首先,你没有return 一个例外......你throw他们。请参阅MSDN。其次,您是否检查过您的查询是否返回有效值?你没有检查任何东西。见MSDN
  • bash.d 此函数仅用于测试,是的,我在执行此之前检查了我的查询值,它返回有效值。

标签: c# .net list exception nullreferenceexception


【解决方案1】:

如果您在问题中向我们展示了您完整的 SellStatement 课程,那么原因很明确:
你从未初始化过ProductNamequantityratePerQuantity。他们是null,这正是异常告诉你的。

要修复它,请将您的课程更改为:

public class SellStatement
{
    public long billNo
    public DateTime paymentDate;
    public List<string> ProductName = new List<string>();
    public List<double> quantity = new List<double>();
    public List<double> ratePerQuantity = new List<double>();
}

请注意,这违反了正常的 C# 设计准则,即不应有公共字段。考虑像这样重新设计您的课程:

public class SellStatement
{
    List<string> _productName = new List<string>();
    List<double> _quantity = new List<double>();
    List<double> _ratePerQuantity = new List<double>();

    public long billNo {get; set;}
    public DateTime paymentDate  {get; set;}
    public List<string> ProductName { get { return _productName; } }
    public List<double> quantity { get { return _quantity; } }
    public List<double> ratePerQuantity { get { return _ratePerQuantity; } }
}

【讨论】:

  • 我认为这就是我的功能所需要的 Daniel,你是真正的专家,非常感谢你,我为这样一个愚蠢的错误感到非常抱歉。
  • @DGibbs:为什么? lss1SellStatement 对象的列表。这很可能是非空的,他的异常位置证实了这一点。问题是每个SellStatement 实例都有null 的成员。仔细查看引发异常的行:lss1[i].ProductName.Add(sdr.GetString(1));:它在ProductName 上调用Add,即null。 NRE 没有发生,因为 lss1lss1[i]null
猜你喜欢
  • 1970-01-01
  • 2018-07-28
  • 2016-01-09
  • 1970-01-01
  • 1970-01-01
  • 2020-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多