在下面的代码中获取Null引用异常

时间:2013-12-08 05:48:09

标签: c#

public class SelectedItems
{
    public Item item;
    public int quantity;
    public double subtotal = 0.0;

}

...

Console.Write("Enter the purchased item count :");
int count = Convert.ToInt32(Console.ReadLine());

while (count > 0)
{  
    SelectedItems itm = new SelectedItems();
    Console.WriteLine("Enter the code :");
    itm.item = searchItem(Convert.ToInt32(Console.ReadLine()));

    Console.WriteLine("Enter the quantity :");
    itm.quantity = Convert.ToInt32(Console.Read());
    itm.subtotal = itm.item.unitprice * (Convert.ToDouble(itm.quantity));
}   

异常发生在最后一行。

3 个答案:

答案 0 :(得分:4)

最可能的情况是您的代码搜索失败并返回null。你应该明确检查一下。

while (itm.item == null)
{
    Console.WriteLine("Enter the code :");
    itm.item = searchItem(Convert.ToInt32(Console.ReadLine()));
    if (itm.item == null)
    {
        Console.WriteLine("Item not found. Try again.");
    }
}

一些补充说明:

  1. 通常公共领域都不满意。如果他们需要公开,最好将它们设为属性,以防您以后想要更改实施。
  2. 我认为SelectedItems类应该计算它自己的小计而不是在外部设置。
  3. 当您处理金钱时,您应该使用自定义Money类,或者至少使用decimal值,而不是加倍。使用decimal,因为它的定点运算通常比使用double(或float)更好,因此您不会处理小数分数。
  4. 示例:

    public class SelectedItems
    {
        public Item Item { get; set; }
        public int Quantity { get; set; }
        public decimal Subtotal
        {
            get
            {
                if (Item == null)
                {
                    return 0m;
                }
                return Item.UnitPrice * Quantity; /* unit price should be decimal */
            }
        }
    }
    

    您可能还想添加一些验证或业务规则检查,例如,数量必须为0或更大。

答案 1 :(得分:0)

如果找不到该项,您的searchItem方法会返回null。您可以检查这种情况并再次询问代码。

while (count > 0)
{  
    Console.WriteLine("Enter the code :");
    Item item = searchItem(Convert.ToInt32(Console.ReadLine()));

    if(item == null){
         // Item not found
         Console.WriteLine("Item not found!");
    }else{
         // Item found
         SelectedItems itm = new SelectedItems();
         itm.item = item;

         Console.WriteLine("Enter the quantity :");
         itm.quantity = Convert.ToInt32(Console.Read());
         itm.subtotal = itm.item.unitprice * (Convert.ToDouble(itm.quantity));

         count--; // update count if success
    }
}

如果找到该项目,请务必更新count

答案 2 :(得分:0)

方法searchItem返回空值。您需要更改它并让它在使用返回值之前抛出异常或进行空检查。

或者更好的是,使用代码约定断言它永远不会返回空值。