譯文:我們為什么愛你--null(1.前奏)

原文地址:http://www.codeproject.com/Articles/787668/Why-We-Should-Love-null?msg=4874666#xx4874666xx

譯者注:首先,中秋節快樂!

本文算是相對少見的一類話題:對null這個特殊元素尋根究底,追根其來源,講述其現狀,更重要的是探討其引發的問題的解決方案。文章很長,我分五部分譯出,也感謝大家的耐心!??

本篇文章為一篇,主要探討null的來源與尋常遇到的問題情況。

? ??

在軟件發展的歷程中,null就像一個幽靈,給人們帶來了無數的問題。如今,null幾乎就等同于“巨大財產損失的BUG”。所以就有很多開發人員想盡一切辦法避免null的出現,比如有人就采用“返回0,而不返回NULL”來處理,也有人采用空對象模式(NullObject Pattern),還有人采用Optional/Maybe 模式。

你覺得在開發中該用這些方法?它們真保證達到一個預期可用性的軟件嗎?抑或還有別的更好的解決方案?這就是這篇文章想要回答的問題。

太多開發人員討厭null,甚至是恨。

null正是臭名昭著的空指針錯誤(即JAVA中空指針異常)的罪魁禍首。

Manchester 學校的計算機系教授?John Sargeant 這么談到:

在JAVA程序運行時,空指針異常無疑是目前最常見的錯誤了。

帶有一點諷刺意味的來說,在JAVA中,空指針異常是唯一一個被人們授予了縮寫名的異常:NPE。所以如果你和一個JAVA的開發人員說“這段代碼里到處都有NPE”,他/她一定能明白你的意思。

(譯者注:中間這里作者有一段比較重復的話..我這里略掉,直入正題!)

好了,有人要問了:“null如此可恨,為何這篇文章還要我們去愛TA”?

別著急,且聽我一一道來。

在現實生活中,對于“無”的概念,我們有千千萬萬中表示方法。我可以舉幾個最簡單的列子,哪怕是小孩子也能看懂:

· 冰箱里沒有巧克力了(There is no chocolate in the fridge. )
· Fred并沒有一輛自行車(Fred doesn't have a bicycle.)
·?教室里空空如也(The class room is empty.)

所以我們可以清晰的認識到:任何程序語言(甚至可以擴展到任何需要展示信息的技術)都必須有一種方式來表達“無”(Nothing)。

在1965年的時候,Tony Hoare想到了一種簡單而聰明的辦法來在計算機領域表示Nothing——你一定猜到了,那就是“null”;

其他語言也有用到一些其他關鍵詞來表示同樣的意思,比如nil,void,none 或者nothing。

請不要忽視null的地位——它真的是一個極其重要甚至奇特的概念。

自從有了null,我們就可以這樣來描述事物了:

·?Alice的生日還沒有存到數據庫里?(alice.birth_date = null)

·?這個顧客還沒有下單(customer.order_list = null)

·?這個操作順利完成,沒有出現任何錯誤。(error = null)

·?我們不知道冰箱里有沒有啤酒(fridge.beer = null)

我們先來看看null的一個簡單的例子:

如果Alice有一個Email,那么代碼大概是這樣:

String email = "alice@company.com";

而如果她沒有Email(或者地址不知道),那代碼就成了這樣:

String email = null;

然后我們檢查她的Email地址是否真的存在,同時進行一點對應的處理:

if ( email != null ) {
   System.out.println ( "Alice's email address is " + email );
} else {
   System.out.println ( "Alice doesn't have an email address." );
}

怎么樣,是不是簡單,實際,上檔次!(譯者:很遺憾不是高大上= = )

既然挺好的,那..問題在哪呢?為什么null會導致這么多問題?

其實有一個非常簡單而又獨一無二的答案:

有時候,我們(開發人員)就是單純忘記考慮某個值為null的情況了

對吧,多么簡單而充分的理由,而且往往就像這樣:

if ( you_never_forget_to_check_for_null ) {
   System.out.println ( "Bravo!!!" );
   System.out.println ( "Enjoy and be proud of an application free of null pointer errors." );
}

而且更加不幸的是,這種“健忘”在實際開發中比比皆是。這樣對于層出不窮的空指針錯誤,咱們也就怪不怪了吧?相比小問題,有些BUG甚至直接導致災難性的后果。

假設就繼續以上述代碼為例,我們忘記檢查Alice的郵件地址是否存在了,直接無視了if判斷然后直接寫:

System.out.println ( "Alice's email address is " + email );

這時候就有兩個非常重要的問題:

如果email變量為null,本應該出現什么狀況?實際又出現了什么狀況?

至少有3種情況有可能發生:

程序無視了null然后這樣打印:

Alice's email address is 

程序直接以“null”打印:

Alice's email address is null

程序直接拋出一個空指針異常(NullPointerException)

這是一個非常小的null場景。盡管如此,但要搞清楚它到底會出現什么情況,還是要通過這些小測試來嘗試,因為它往往都依賴于我們所采用的開發語言以及編譯器。很多經驗豐富的程序猿(包括我)在遇到這種情況的時候都會絞盡腦汁地去預測它可能出現的情況,而且毫不猶豫。這里我用了JAVA 8 ,然后非常迫切的等待這個結果。結果就是這樣:

Alice's email address is null

有人肯定會覺得:“這挺好的啊,系統告知我們這個email是未知的了,而且更重要的是沒有空指針異常出現。”


好了,我們剛剛上面使用了一個例子,而且我們想盡量的避免,或者壓制住空指針錯誤的產生。

不過有一個疑問:這樣做好嗎?去想辦法躲避空指針,這種做法真能提高代碼的質量和軟件的可用性嗎?我們的開發中確實很需要這種技術嗎?

在回答這個問題之前:我們先來看看目前比較流行的“防null大法”

1. 采用0來代替null
2. 使用空對象模式
3. 使用Optional/Maybe模式


【未完待續...下篇開始將會對這三種方式進行深入講解】

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,431評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,637評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,555評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,900評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,629評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,976評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,976評論 3 448
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,139評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,686評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,411評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,641評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,129評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,820評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,233評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,567評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,362評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,604評論 2 380

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,828評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,759評論 25 708
  • 天氣漸涼的秋天,來了一男兩女一個小男孩要做鑒定,鑒定小男孩是不是成年男子的孩子。男人和其中一個女人是南方口音,40...
    8efe372a05c4閱讀 270評論 0 0
  • 1.首先下載“135編輯器". 2.在135編輯器有很多素材可用。操作...點開素材庫,復制到微信的后臺的編輯框里...
    b49f7667e319閱讀 633評論 0 1
  • 下班回到家,換掉鞋子,懶洋洋的斜靠在沙發上準備休息一會做晚飯,一靜下來才聽見廚房有滴答滴答的滴水聲,發現有漏水...
    min心情閱讀 254評論 0 0