在.net编程中,当我们使用一个并不存在的对象时,系统就会抛出这个异常:System.NullReferenceException: 未将对象引用设置到对象的实例。下面把几种常见的场合做下介绍:
1.没有传参数给当前页面,却在程序里直接获取
如果我们没有给页面传一参数,假设参数名为name,但我们直接在程序里用Request.QueryString["name"]获取,则必然出现未将对象引用设置到对象的实例异常,例如:
string name = Request.QueryString["name"].ToString();
要避免出现此类异常,可先进行参数是否为空判断:
if (Request.QueryString["name"] != null)
{ string name = Request.QueryString["name"].ToString(); }
2.Session,ViewState等内置对象未定义时直接使用
当我们没有定义Session,ViewState时却直接引用,例如:
string name = Session["name"].ToString();
此时则也会引发“未将对象引用设置到对象的实例“异常,解决这类问题可先定义值,例如:
Session["name"] = "abc";
ViewState["name"] = "abc";
则此时再执行string name = Session["name"].ToString()则不会出现错误,当然在引用前进行是否为空判断,也是很必要的:
if (Session["name"] != null)
{ string name = Session["name"].ToString(); }
3.下拉列表不存在某值时却设置该值为选定状态
当我们要设定下拉列表某项为选定状态时,经常使用 this.ddl.Items.FindByValue("abc").Selected = true;
但是当下拉列表的项目中并不存在"abc"这一项时,则会引发“未将对象引用设置到对象的实例“异常,解决该类问题是应先判断下拉列表里是否存在该项,存在才可做此设置:
for (int i = 0; i < this.ddl.Items.Count; i++)
{
if (this.ddl.Items[i].Value.Equals("abc"))
{ this.ddl.Items[i].Selected = true; break; }
}
4.记录集DataSet里不存在表格却直接引用
当我们将记录集绑定到GridView时,经常用到this.GridView1.DataSource = DataSet1.Tables[0].DefaultView;
但是当DataSet1里根本就不存在数据表时,则必然会引发“未将对象引用设置到对象的实例“异常,解决该类问题是在绑定前判断表格是否存在:
if(DataSet1.Tables.Count > 0)
{this.GridView1.DataSource = DataSet1.Tables[0].DefaultView;}
5.页面未定义控件,却在程序里直接引用
此种情况不多见,但也偶有发生,一般是修改页面时误操作,例如上例,如果我们不小心把GridView1删除了,则此时再执行
if(DataSet1.Tables.Count > 0)
{this.GridView1.DataSource = DataSet1.Tables[0].DefaultView;}
则定会引发“未将对象引用设置到对象的实例“异常,此时重新添加上GridView1控件即可。