Welcome

首页 / 软件开发 / .NET编程技术 / 一个十分诡异的NullReferenceException异常

一个十分诡异的NullReferenceException异常2011-02-03 博客园 周雪峰看到标题大家可能会认为这个文章一定没有太大的新意,无非是忘记初始化一类的问题,但是建议大家慢慢看下去,我担保这个问题决非这么无聊,希望给大家增加一些乐趣啊!

大家可以这样重现这个问题:

1,在窗体上放置一个TabControl控件有2个页(tabPage1,tabPage2),tabPage1的为当前页。

2,在tabPage1上放置一个 DataGridView控件dgv1,tabPage2上放置一个DataGridView控件dvg2并且两个DataGridView的 AutoSizeColumnsMode 属性为Fill,设置好两个DataGridView的数据源后(这里大家可以自己设置一些数据源,保证有一列的数据就可以,设置数组等也可以)。

3,订阅窗体的Load事件,事件处理程序如下:

private void form1_Load(object sender, EventArgs e)
{

dgv1.Columns[0].HeaderText = "名称";
dgv1.Columns[0].Width = 120;
dgv2.Columns[0].HeaderText = "名称";
dgv2.Columns[0].Width = 120;//运行到这句的时候就会发生NullReferenceException异常;
}

按如上步骤,应该可以重现这个问题了,问题十分诡异,设置HeaderText时候没有抛出NullReferenceException异常,这说明dgv2.Columns[0]不是null,经过监视窗口观察,他的确不是null。

那到底什么是null呢?大家可能认为我又会像过去的一些文章中用IL说明问题吧!

这回不用IL来说明,我们看看类库中的源代码:

DataGridViewColumn类的Width属性是这样定义的:

public int Width
{
get
{
return this.Thickness;
}
set
{
this.Thickness = value;
}
}