-1

可能重复:
.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);
        }
    }

}
4

7 回答 7

4

如果f1.getArray()返回 a null,那是我期望的异常。

但问题就在这里:

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

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

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

于 2011-07-26T20:00:55.327 回答
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!
    }
    //...
 }
于 2011-07-26T20:04:08.847 回答
0

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

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

于 2011-07-26T20:03:16.753 回答
0

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

于 2011-07-26T20:03:28.297 回答
0

数组列表阿尔卡;在没有元素的情况下创建,当您调用 GetArray() 时会将其返回 null 并且您的异常是您可以在 Form1 中制作的解决方案之一

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

在form2中

     ArrayList al = new ArrayList();
     public Form2(ArrayList  alcar)
     {
         al = alcar;
         InitializeComponent();
于 2011-07-26T20:05:12.653 回答
0

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

alcar你从来没有为那个特定的实例发起过。您需要获取用户单击 button1 的 Form1 实例。

于 2011-07-26T20:04:10.623 回答
0

尝试这个

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

    return alcar;
}
于 2011-07-26T20:04:10.717 回答