对象引用未设置为对象的实例...使用foreach时出错

时间:2011-07-26 19:58:20

标签: c# nullreferenceexception object-reference

  

可能重复:
  What is a NullReferenceException in .NET?

我正在开发一个简单的程序。接受Form1中的arraylist并在form2上显示其内容,我收到此错误.Plz启发我..编码就是这样..

Form1.cs的..............

public partial class Form1 : Form
{
    ArrayList alcar;
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        string name = textBox1.Text; ; int quantity = int.Parse(textBox2.Text);
        car c = new car(name, quantity);
        if (alcar != null)
        {
            alcar.Add(c);
        }
        else
        {
            alcar = new ArrayList();
            alcar.Add(c);
        }
        Form2 f2 = new Form2();
        f2.Show();
    }
    public ArrayList getArray()
    {
     return alcar;
    }    
}
class car
{
    string name; int quantity;
    public string NAME
    {
        get { return name; }
        set { name = value; }
    }
    public int QUANTITY
    {
        get { return quantity; }
        set { quantity = value; }
    }
    public car(string n, int q)
    {
        name = n; quantity = q;
    }
}

FORM2.cs .........................

public partial class Form2 : Form
{
    ArrayList al;
    public Form2()
    {
        Form1 f1 = new Form1();
        if (al != null)
        {
            al = f1.getArray();
        }
        else
        {
            al = new ArrayList();
            al = f1.getArray();
        }

        InitializeComponent();
        foreach (car c in al)        // this lne is causing error
        {
            label1.Text = c.NAME;
            label2.Text = Convert.ToString(c.QUANTITY);
        }
    }

}

7 个答案:

答案 0 :(得分:4)

如果f1.getArray()返回null,那就是我期望的例外情况。

但问题在于:

// In Form2
Form1 f1 = new Form1();

这会创建一个 new Form1实例,而不是您创建汽车的实例。它将在数组中没有任何内容。在这个新实例中,您永远不会初始化alcar或填充它,因此默认情况下为null。获取此null对象并尝试迭代它是您的错误来源。

重新考虑您的设计,以便直接将数组传递给第二个表单(在自定义构造函数或属性上)。

答案 1 :(得分:1)

为什么不在字段声明中编写new,这将简化您的代码:

public partial class Form1 : Form
{

    ArrayList alcar = new ArrayList(); // DO THIS HERE!

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        string name = textBox1.Text; ; int quantity = int.Parse(textBox2.Text);
        car c = new car(name, quantity);

        //JUST ADD - without checking for null!
        alcar.Add(c);

        Form2 f2 = new Form2();
        f2.Show();
    }
    public ArrayList getArray()
    {
         return alcar; //its non-null - guaranteed!
    }
    //...
 }

答案 2 :(得分:0)

您在Form2的ctor中创建Form1的新实例,它从不显示它的UI,因此当您说al = f1.getArray()时,永远不会被点击。在Form2的ctor中,它返回一个空引用。

使用已存在的Form1的引用,而不是创建新引用。

答案 3 :(得分:0)

除非单击该按钮,否则不会在Form1中实例化ArrayList alcar。您需要检查null并在Form1的GetArray方法中实例化alcar。或者,在Form1的构造函数中实例化alcar。

答案 4 :(得分:0)

在Form2中,您创建一个Form1的新实例: Form1 f1 = new Form1();

您从未为该特定实例启动alcar。您需要获取Form1的实例,其中用户单击了button1。

答案 5 :(得分:0)

试试这个

public ArrayList getArray()
{
    if(null == alcar)
         alcar = new ArrayList();

    return alcar;
}

答案 6 :(得分:0)

ArrayList alcar; 在没有元素的情况下创建,当你调用GetArray()时,它将返回null并且你有异常 您可以在Form1中进行的一种溶剂

        Form2 f2 = new Form2(alcar);
        f2.Show();

和form2

     ArrayList al = new ArrayList();
     public Form2(ArrayList  alcar)
     {
         al = alcar;
         InitializeComponent();