如何最大程度得避免空指針

空指針的問題可以追溯到計算法發(fā)展史時期脚草,同時空指針異常的情況也很多造锅,甚至在程序運行階段也無法避免空指針的情況。那么输涕,在編碼層面音婶,我們需要注意哪些呢?

確認調用的的每個變量都已經被初始化

這點說起來很簡單莱坎,但事實上隨著業(yè)務的發(fā)展項目代碼也會越來越龐大衣式。這時候方法之間調用的關系也會越來越復雜,很難避免使用到的方法都已經明確被初始化檐什。

所以這塊單獨放在這里碴卧,需要我們在編碼的時候重點考慮變量存在的可能性,這其實大體上基于自己的實際編碼經驗乃正。

盡量使用明確的值調用

如果已經明確某個變量(常量)的值住册,那么是可以安全調用它的方法的。例如對比下面的幾行代碼:

String a = null;
a.equal("b");   // 會產生空指針異常
"b".equal(a);   // 推薦的寫法

很明顯使用常量去做調用這代碼會更健壯一些瓮具。

盡量避免在函數中返回 NULL

當如果在編寫方法中考慮返回 NULL荧飞,這個時候則需要冷靜下是否真的需要這樣子做。因為搭综,通常來說會有比返回 NULL 更好的處理方式。

自動裝箱需謹慎

自動裝箱確實為編寫程序帶來很多方便划栓,但我們在編程時候也不能濫用自動裝箱兑巾。
比如,下面這個程序依然存在空指針異常隱患:

Person jack = new Person("jack");
int weight = jack.getWeight();

這種異常在我們使用一些 ORM 框架中會碰到忠荞,如果數據庫對應的對象并不存在該值蒋歌,而我們又在類中使用了一個基本類型與之對應,依然就會拋出空指針異常委煤。在這種情況下就盡量使用包裝類來對應堂油,并且在使用該值時候先判斷是否為空。

遍歷謹防集合為空

for (int num : list) {
    // for each num in list
}

及時驗證外部數據

在代碼運行的過程中碧绞,尤其在解析外部數據的時候可能會引發(fā)影響不到的問題府框。例如下面的 Json 數據

{"name": null, age: 28}

如果不處理完善,直接使用 name 屬性也會導致空指針的問題讥邻。

使用第三方庫加強驗證

很多第三方的 Common 庫都會有驗證空指針的方法迫靖,例如 Guava 中針對空指針的判斷有個單獨的包去處理院峡。

Optional<Integer> possible = Optional.of(5);
possible.isPresent(); // returns true
possible.get(); // returns 5

或者過濾 NULL 也會更加的方便

Joiner joiner = Joiner.on("").skipNulls();
return joiner.join("Harry", null, "Ron", "Hermione");

使用 @NotNull 或 @Nullable 注解

強烈建議多使用注解來增加代碼的可讀性,例如多增加 @NotNull 或 @Nullable 注解系宜,也
可以加強代碼靜態(tài)檢查方面可能會造成空指針的可能性照激,具體可以參見這里

使用 Java8 的 Optional

很多「現(xiàn)代」語言都會有針對變量為空的可選鏈式判斷盹牧,例如

Grovvy 語言有一個 ?. 的操作符俩垃,可以安全地處理潛在可能的空引用(據說 Java7 曾被建議引入這個但是并沒有發(fā)布)。它是這么用的:

String version = computer?.getSoundcard()?.getUSB()?.getVersion();

雖然 Java 看起來非常的保守汰寓,但好在 Java8 中增加了 Option[T] 這個對象包來代表類型 T 的某一個值存在或者沒有口柳。

那么上面的代碼可以寫成

String name = computer.flatMap(Computer::getSoundcard)
                          .flatMap(Soundcard::getUSB)
                          .map(USB::getVersion)
                          .orElse("UNKNOWN");

看起來似乎有點麻煩,但相信我你會愛上這樣的寫法踩寇,具體可以參見這里啄清。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市俺孙,隨后出現(xiàn)的幾起案子辣卒,更是在濱河造成了極大的恐慌,老刑警劉巖睛榄,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荣茫,死亡現(xiàn)場離奇詭異,居然都是意外死亡场靴,警方通過查閱死者的電腦和手機啡莉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來旨剥,“玉大人咧欣,你說我怎么就攤上這事」熘模” “怎么了魄咕?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蚌父。 經常有香客問我哮兰,道長,這世上最難降的妖魔是什么苟弛? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任喝滞,我火速辦了婚禮,結果婚禮上膏秫,老公的妹妹穿的比我還像新娘右遭。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布狸演。 她就那樣靜靜地躺著言蛇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宵距。 梳的紋絲不亂的頭發(fā)上腊尚,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機與錄音满哪,去河邊找鬼婿斥。 笑死,一個胖子當著我的面吹牛哨鸭,可吹牛的內容都是我干的民宿。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼像鸡,長吁一口氣:“原來是場噩夢啊……” “哼活鹰!你這毒婦竟也來了?” 一聲冷哼從身側響起只估,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤志群,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蛔钙,有當地人在樹林里發(fā)現(xiàn)了一具尸體锌云,經...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年吁脱,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兼贡。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖涉兽,靈堂內的尸體忽然破棺而出别厘,到底是詐尸還是另有隱情,我是刑警寧澤渴肉,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站乌奇,受9級特大地震影響,放射性物質發(fā)生泄漏试伙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧涮坐,春花似錦、人聲如沸捷雕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帽哑。三九已至,卻和暖如春叹俏,著一層夾襖步出監(jiān)牢的瞬間妻枕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工粘驰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留佳头,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓晴氨,卻偏偏與公主長得像康嘉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子籽前,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內容