在平時的業(yè)務(wù)開發(fā)中,空值處理是非常麻煩的,Java中的空指針異常讓人崩潰,每次看到日志中出現(xiàn)的那些NPE Error日志,都讓人痛不欲生。為了避免這么多空指針異常,你的Java程序中是不是遍布著null檢查?
null是一個討厭鬼
null語義不明,通常null什么都不能代表,而又什么都能代表。如果你不檢查,空指針異常必定會在最關(guān)鍵的時候蹦出來。
比如說:
對于集合類型來說,空有兩種含意:
1、變量是空引用,也就是變量沒指向一個集合類型。
2、集合中元素數(shù)量為0。
所以經(jīng)常我們要做如下的檢查
list!=null&&list.size()>0
那我們就像上面一樣在每一處都做空值檢查如何呢?理論上可以,但是實際實行時卻困難重重,可能會引起如下的問題:
增加代碼長度
問題:大部分代碼都是在檢查空值上面;一個方法30行代碼,有10行是檢查各種參數(shù),10行進(jìn)行異常處理,5行進(jìn)行業(yè)務(wù)處理,再寫5幾行注釋。你是這是什么事兒啊。
減少寫代碼的樂趣
問題:注意力集中的時間段是非常寶貴的。現(xiàn)在的互聯(lián)網(wǎng)公司,辦公區(qū)開放、各部門都混坐一起,如果你跟產(chǎn)品和運營坐在一起,那么你從早到晚不停的被打擾,8小時工作時間能集中精力3個小時已經(jīng)很不容易了。而這短短的有效時間內(nèi),還要編寫大量的防御性代碼,別人不知道,對于我來說,大量編寫這樣的代碼經(jīng)常會讓我思路分散,反而導(dǎo)致我在真正的業(yè)務(wù)代碼上面出錯。
這個問題怎么破
實話是:很難破
多年編碼后也僅僅總結(jié)了幾個規(guī)約,可以減輕空值帶來的痛苦:
對于空值最常用的辦法就是:不相信任何輸入輸出值,每一個關(guān)鍵的參數(shù)都需要檢查。關(guān)鍵的意思是:如果為空就影響業(yè)務(wù)處理了。
如果集合中沒有元素,使用size為0的空集合對象,不要使用null。
除非null有特殊含意,方法返回的普通對象都不為null。如:從數(shù)據(jù)庫查找對象的方法,如:findById,返回null表示沒有找到對象。
使用基本的值類型,而不使用包裝過的類型,如:使用int double等等,不使用Integer
免不了有null時,使用guava中的Optional對象,據(jù)說可以方便的檢查和操作null,JDK8以后也在java.util包中增加了Optional對象。但是實際它的作用更多的是提醒程序員要注意空值處理而已。
集合對象中不保存null。
Map中不保存value為null的K-V對兒,也不用null做key。
使用高效工具對入?yún)閚ull進(jìn)行檢查,如Spring中的Asserts工具類,Guava中的Preconditions工具類;
以上就是長沙牛耳教育java培訓(xùn)機構(gòu)的小編針對“編程基礎(chǔ)Java空指針異常”的內(nèi)容進(jìn)行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務(wù)。