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

本文关键字:使用 foreach 出错 实例 设置 对象 对象引用 | 更新日期: 2023-09-27 18:03:42

可能重复:
什么是.NET中的NullReferenceException?

我正在开发一个简单的程序。接受来自Form1的数组列表并在form2上显示其内容,我收到了这个错误。。请启发我…编码是这样的。。

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);
        }
    }
}

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

如果f1.getArray()返回null,这就是我所期望的异常。

但问题就在这里:

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

这会创建一个新的Form1实例,而不是您在其中创建汽车的实例。它在数组中什么都没有。在这个新实例中,您永远不会初始化alcar或填充它,所以默认情况下它是null。获取这个null对象并尝试对其进行迭代就是错误的来源。

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

为什么不在字段声明中编写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!
    }
    //...
 }

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

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

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

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

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

试试这个

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

ArrayList alcar;在没有元素的情况下创建,并且当您调用GetArray((时,它将返回null,并且您有异常你可以在Form1 中制作的解决方案之一

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

并且在形式2中

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