对象引用未设置为对象的实例..使用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);
}
}
}
如果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();