使用 foreach 循环和 NullReferenceException 打印对象
本文关键字:打印 对象 NullReferenceException foreach 循环 使用 | 更新日期: 2023-09-27 18:35:17
我已经开始学习C#,我一直在关注我在网上找到的一些"迷你项目",还有一些是我自己编造的,以帮助我理解基础知识。这个小项目要求我创建两个名为"项目"和"库存"的类。这个想法是,item 类用于创建项目,另一个库存类用于存储项目并打印它们。这是到目前为止的代码:
class Program
{
static void Main(string[] args)
{
inventory my_inventory = new inventory();
item cake = new item("Cake", 2.99, 001);
item carrot = new item("Carrot", 0.59, 002);
my_inventory.add_item(cake);
my_inventory.add_item(carrot);
my_inventory.print_inv();
Console.ReadLine();
}
}
class item
{
string name;
double price;
int id;
public item (string Name, double Price, int ID)
{
this.name = Name;
this.price = Price;
this.id = ID;
}
public item()
{
this.name = "unknown";
this.price = 0.00;
this.id = 000;
}
public override string ToString()
{
return "Name: " + name + " Price: " + price + " ID Number: " + id;
}
}
class inventory
{
object[] inv_list = new object[10];
int tracker = 0;
public void add_item(object obj)
{
inv_list[tracker] = obj;
tracker++;
}
public void print_inv()
{
foreach ( object obj in inv_list) { Console.WriteLine(obj.ToString()); }
}
}
我一直遇到的错误是print_inv()
方法中的"NullReferenceException",从我所读到的内容来看,这意味着我尝试在 print_inv() 方法上使用的对象是空的?我不确定这在我的代码中意味着什么。
这里的问题是,当你创建一个东西的数组时,它会用某物的默认值进行初始化。如果是object
,默认值为 null
。
因此,您需要修改print_inv
方法来查看现有项目:
public void print_inv()
{
for(int i =0; i < tracker; i++)
{
Console.WriteLine(inv_list[i].ToString());
}
}
问题是,由于您声明了一个特定大小(new object[10]
)的数组,因此数组始终是该大小。因此,当你迭代它(foreach(object obj in inv_list
)时,你将得到一切,而不仅仅是你显式初始化的值。由于object
的default
是null
,因此数组中除了那些显式项目之外的所有项目都是空的。
有几种方法可以解决此问题:
- 将
foreach
替换为for(int i = 0; i < tracker; i++)
- 这只会遍历项目直至跟踪器计数,仅此而已。 - 使用
List<object>
而不是数组。这将允许您添加/删除项目,而不必明确担心容量,因此应避免大多数自动初始化的值。但是,可能需要更多代码才能将库存保持在 10 个项目以下。 - 检查空值和
continue
或break
当您在物品栏中遇到空物品时。