對象為null時調用給對象的屬性或方法 “未將對象引用到實例”是很多像我一樣的初學者經常遇到的一個問題,常常令人煩惱不已,那麼這個問題是怎麼發生的呢?先給大家看一張圖,我們從這張圖入手來分析這個錯誤造成的原因。 可能很多人看到這樣的代碼會覺得可笑:”能寫出這樣的代碼,看來此人的智商已“超越”人類的範...
對象為null時調用給對象的屬性或方法
“未將對象引用到實例”是很多像我一樣的初學者經常遇到的一個問題,常常令人煩惱不已,那麼這個問題是怎麼發生的呢?先給大家看一張圖,我們從這張圖入手來分析這個錯誤造成的原因。
可能很多人看到這樣的代碼會覺得可笑:”能寫出這樣的代碼,看來此人的智商已“超越”人類的範疇了!“
但是就是有某些內褲外穿的超人叔叔經常不間歇性的寫出這樣的代碼、遇到這樣的問題。
從這張圖上我們很容易看出Too.f1.array[i]是為null的,這時我們調用它的屬性或方法是肯定會報錯的!那為什麼當對象為null時調用它的屬性或方法會報錯呢?
我們都知道數組是引用類型,引用類型的數據值會存放在堆記憶體中在棧中存儲的只是一串記憶體地址如圖所示:
通過這張圖我們可以看到它的屬性是存放在堆記憶體中的,而對象為null就是指該對象沒有在堆記憶體中開闢空間,也就沒辦法通過棧記憶體訪問到存放在堆記憶體中的屬性,所以系統運行時就會提示錯誤。
引用類型數據賦給另一個同類型引用類型數據所帶來的問題
我們再來看一張圖:
初看這多代碼好像並沒有什麼“不妥”,語法上也沒報錯!但是運行時卻出現了未將對象引用到實例的問題附圖一張:
這又是怎麼回事呢?我們前面說過棧記憶體中存儲的是一串堆記憶體的記憶體地址。而sb=txt只是將數組txt在堆記憶體中的記憶體地址賦給了數組sb也就是說數組txt和數組sb在棧記憶體中存儲的堆記憶體的記憶體地址是一樣的,而txt[0]=null也就是將txt【0】對應的在堆記憶體中的空間給刪除,而數組txt和數組sb是共用一樣的堆記憶體中的記憶體地址所以數組sb【0】也沒有對應的堆記憶體的記憶體空間所以會在運行時報錯,原理請參照對象為null時調用給對象的屬性或方法