C#报错:未将对象设置到对象实例 Object reference not set to an instance of an object

见到这异常:就是一个Null的对象调用了方法(属性或其它成员)变成Null.XXX引发的。

当然啦,出现这种异常的场景,那可是万万千,数也数不完,但本质是一样的。

这个错误很常见,使用了null的对象,就会出现这问题。

空对象使用就会出错,比如string str=User.name;如果User=null就报这个错

原因一:名称错误导致找不到
在获取控件的时候,原代码为: “text1 = GetControl(“Content/Main/Body/Mail1/Text”);” 出错的原因很简单,获取控件的时候遗漏了初始路径并使用了错误的控件名。
这里要提醒大家的是,如果是从零开始获取的控件,一定要记得从最初始的路径开始获取,直接点说就是面板里最上面的控件。一定要核对控件名的拼写,确保正确。这类错误百分五十都是因为拼写控件名错误导致的。而且要注意的是,控件名称不要使用中文符号,类似“(”、“)”的,都无法获取。最简单保险的方法就是获取控件的时候直接从面板里复制控件名称,这样最不容出错。

原因二:时序逻辑问题,异步给变量赋值时,在赋值之前就引用了这个空的变量
比如加载一些大的数据对象、图像对象等,可能还没加载完就进行了调用,这时为空肯定报错。

在Unity生命周期中,把实例化写在start()方法里面,而我又写的是用一个类去调用另一个类,而两个类中的变量都需要实例化,那么我在用A类去调用B类时,B类中的变量又可能还没有实例化,导致B类中的变量返回值为空。

解决方法是把最先实例化的全部放在Awake()方法中去,最后问题解决。

当你在写程序时,你认为一个变量一定是已经赋值得到了实际对象的。如果运行时遇到这个“指向null”异常,那么你应该开始调试程序,追踪前边的代码(或者程序调用堆栈上更深层入口方法)为什么没有给这个变量传递值(对象)。这往往是因为程序逻辑错误造成的,你应该搜索一下你到底有没有为 commandCanalService 这个变量赋值。

解决方法:判空
添加判断if(obj!=null){do something…} 或在调用前提前(实例化)加载对象

函数比较容易看的出:如果参数value传进来为Null的时候,就等于Null.Replace被调用,就出现了上面的错误。

因此,通常的,在函数的首行,都会对value进行:if(!string.IsNullOrEmpty(value)) 一下。

示例2:再举一下通用性的调用错误,绑定,Eval(“字段”) ,这个方法比较常见,某些情况要转字符串比较,这里示例一下:

<%# Eval(“字段”).ToString()==“1”?“Yes”:“No” %>

当Eval(“字段”)为Null时,一个Null.ToString(),必然也会出现上面的错误,那什么情况出现?

1:字段的值为Null

2:空数据行,就是你表一行数据都没有,全是Null。

所以预防性的写法是:

<%# Convert.ToString(Eval(“字段”))==“1”?“Yes”:“No” %

当然如果你仅仅是写个

C# code?

1

2

3

4

if(obj!=null){do something…}
这虽然能够让你的程序不抛出异常了,可是没有解决逻辑错误问题,你还是没有搞清楚为什么没有给 变量赋值。

实际解决如下:
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41883890/article/details/128806093