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));
}
异常发生在最后一行。
答案 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.");
}
}
一些补充说明:
SelectedItems
类应该计算它自己的小计而不是在外部设置。Money
类,或者至少使用decimal
值,而不是加倍。使用decimal
,因为它的定点运算通常比使用double
(或float
)更好,因此您不会处理小数分数。示例:
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
返回空值。您需要更改它并让它在使用返回值之前抛出异常或进行空检查。
或者更好的是,使用代码约定断言它永远不会返回空值。