未将对象设置到对象实例 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...}|
这虽然能够让你的程序不抛出异常了,可是没有解决逻辑错误问题,你还是没有搞清楚为什么没有给 变量赋值。