前言
只要是接觸過(guò)java的人都不會(huì)對(duì)null感到陌生。null在java里是很神奇的東西宏浩,默認(rèn)情況下可以充當(dāng)任何參數(shù)知残,但很多時(shí)候又會(huì)造成錯(cuò)誤。谷歌在Guava的wiki說(shuō)比庄,null在95%的場(chǎng)合下是不需要的求妹。
對(duì)于安卓開(kāi)發(fā)而言,因?yàn)镚oogle Play禁止熱更新佳窑,App的bug-free更為重要扒最,而毫無(wú)疑問(wèn)的最大bug就是NullPointerException了。因此华嘹,討論null,對(duì)代碼穩(wěn)定性是有著顯著意義的法竞。
初級(jí)處理方法
初級(jí)開(kāi)發(fā)者很常見(jiàn)的一個(gè)問(wèn)題就是到處都進(jìn)行if(object!=null)的判斷耙厚。其實(shí)這不單單是這個(gè)判斷的問(wèn)題,而在于初級(jí)開(kāi)發(fā)者往往沒(méi)有往更深層次思考:這里到底應(yīng)不應(yīng)該出現(xiàn)null岔霸?如果不應(yīng)該薛躬,為什么出現(xiàn)了?如果應(yīng)該呆细,那么這個(gè)判斷就是合理而且必須的型宝。
也就是說(shuō),拋開(kāi)技術(shù)層面不談絮爷,關(guān)于null更多是一種思考和編程的方式趴酣。
拿安卓來(lái)舉例,常見(jiàn)的場(chǎng)合就是從API獲取數(shù)據(jù)的時(shí)候可能會(huì)產(chǎn)生null坑夯,也就是說(shuō)后端是源頭岖寞。因此,客戶端不應(yīng)該信任后端對(duì)null的處理柜蜈,無(wú)論是馬上進(jìn)行null的排查也好仗谆,進(jìn)行默認(rèn)值的設(shè)置也好,在這一步就可以把null排除掉淑履。這樣下游的一些方法或者類(lèi)使用數(shù)據(jù)的時(shí)候隶垮,就不用擔(dān)心null。
此外秘噪,安卓本身系統(tǒng)也可能導(dǎo)致null狸吞,getContext()可能會(huì)失敗。當(dāng)然這并不是世界末日,對(duì)于這種情況捷绒,try-catch組合正好可以用來(lái)處理失敗瑰排。
總體而言,對(duì)于null:
- 如果不接受null暖侨,要在源頭就把null去除椭住;
- 如果接受null,要知道它代表什么字逗,以及如何處理京郑;
- 對(duì)于無(wú)法去除的意外的null,妥善捕獲處理葫掉。
null的處理
- 對(duì)象默認(rèn)值
可以在新建一個(gè)對(duì)象的時(shí)候就設(shè)置好參數(shù)的默認(rèn)值些举。 - 替代null
還有一個(gè)思路就是,在object=null的時(shí)候替換掉null俭厚。很多get函數(shù)有第二個(gè)參數(shù)就是用來(lái)設(shè)置替代值的户魏。此外,java 8和Guava都有Optional挪挤,可以使用Optional.fromNullable(x).or(defaultValue)來(lái)把可能的null用默認(rèn)值代替叼丑。 - 使用能接受null的函數(shù)
有些函數(shù)接受null為參數(shù)。例如a.equals(b)扛门,b可以為null而a不能鸠信,這就是一個(gè)小trick。
當(dāng)然论寨,以上介紹的其實(shí)都是很基礎(chǔ)的方法星立,不過(guò)簡(jiǎn)單并不代表不重要。相反葬凳,細(xì)微之處見(jiàn)功夫绰垂。