使用foreach循环和NullReferenceException打印对象

时间:2014-12-24 15:18:50

标签: c# visual-studio foreach nullreferenceexception

我已经开始学习C#了,我一直在关注网上发现的一些“迷你项目”,有些我自己帮我理解基础知识。这个迷你项目要求我创建两个名为“item”和“inventory”的类。这个想法是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()方法上使用的对象是null?我不确定这在我的代码中意味着什么。

2 个答案:

答案 0 :(得分:1)

这里的事情是,当你创建一个东西的数组时,它会用某个东西的默认值进行初始化。如果是object,则默认值为null

因此,您需要修改print_inv方法以查看现有项目:

public void print_inv() 
{
   for(int i =0; i < tracker; i++)
   {
      Console.WriteLine(inv_list[i].ToString());
   }
}

答案 1 :(得分:0)

问题在于,因为您声明特定大小(new object[10])的数组,所以总是那个大小。因此,当您迭代它(foreach(object obj in inv_list)时,您将获得所有内容,而不仅仅是您已明确初始化的值。由于default的{​​{1}}为object,因此除了数组中的所有显式项之外的所有项都为空。

有几种方法可以解决这个问题:

  • null替换为foreach - 这只会在项目之前迭代到跟踪器计数,而不再是。{/ li>
  • 使用List<object>代替数组。这将允许您添加/删除项目,而不必明确担心容量,因此应避免大多数自动初始化的值。但是,可能需要更多代码才能将库存保持在10个项目之下。
  • 当您点击广告资源中的空项目时,检查是否为空for(int i = 0; i < tracker; i++)continue