对象为null时调用给对象的属性或方法
“未将对象引用到实例”是很多像我一样的初学者经常遇到的一个问题,常常令人烦恼不已,那么这个问题是怎么发生的呢?先给大家看一张图,我们从这张图入手来分析这个错误造成的原因。
可能很多人看到这样的代码会觉得可笑:”能写出这样的代码,看来此人的智商已“超越”人类的范畴了!“
但是就是有某些内裤外穿的超人叔叔经常不间歇性的写出这样的代码、遇到这样的问题。
从这张图上我们很容易看出Too.f1.array[i]是为null的,这时我们调用它的属性或方法是肯定会报错的!那为什么当对象为null时调用它的属性或方法会报错呢?
我们都知道数组是引用类型,引用类型的数据值会存放在堆内存中在栈中存储的只是一串内存地址如图所示:
通过这张图我们可以看到它的属性是存放在堆内存中的,而对象为null就是指该对象没有在堆内存中开辟空间,也就没办法通过栈内存访问到存放在堆内存中的属性,所以系统运行时就会提示错误。
引用类型数据赋给另一个同类型引用类型数据所带来的问题
我们再来看一张图:
初看这多代码好像并没有什么“不妥”,语法上也没报错!但是运行时却出现了未将对象引用到实例的问题附图一张:
这又是怎么回事呢?我们前面说过栈内存中存储的是一串堆内存的内存地址。而sb=txt只是将数组txt在堆内存中的内存地址赋给了数组sb也就是说数组txt和数组sb在栈内存中存储的堆内存的内存地址是一样的,而txt[0]=null也就是将txt【0】对应的在堆内存中的空间给删除,而数组txt和数组sb是共用一样的堆内存中的内存地址所以数组sb【0】也没有对应的堆内存的内存空间所以会在运行时报错,原理请参照对象为null时调用给对象的属性或方法