回覆列表
  • 1 # 使用者9161091912394

    null的問題比除0更廣泛。

    對於null,大家普遍都拿他當作“沒有”的表示方式。比如getUser(userId)函式返回null,表示“找不到這個userId對應的user”。你可以強調說應該拋異常,或者使用Optional,或者以其他的形式表達“沒有”,但是現實就是,使用null表示“沒有”已經成為了某種“共識”。

    而一旦一個東西沒有,對其進行某個操作就是未定義的。例如getUser(userId).name可能就會NPE,因為user沒有的情況下,獲取其name也就沒有意義。程式不會曉得沒有user的情況下name應該怎麼處理。如果不寫程式碼特殊照顧,程式就只能傻乎乎的拋NPE等價的錯誤。於是這就需要程式設計師必須不斷的做NPE檢查。而人做這種工作,在沒有其他支援下,有遺漏是必然的。某些遺漏造成的NPE會帶來災難性的結果。你能想象一個做手術的機器人程式,或者飛機飛控程式出現一個NPE是什麼結果嗎?

    對於NPE有這麼幾種方案

    1)完全不接受null。但“沒有”這個概念得另外想辦法。比如每個欄位foo,都得弄一個對應的hasFoo的欄位表示。取值也總得弄兩次。但這樣作和上面的問題是等價的,會遺漏if (foo != null)的程式設計師肯定也會遺漏if (hasFoo)。要不就把foo和hasFoo外邊套一層,逼著程式設計師用getOrElse這樣的方式做NPE檢查。Option這類方案就是如此。

    2)允許null,但是控制null的範圍。假設程式在對外接觸的介面上(比如介面的controller,訪問DB時)進行判空,處理所有“沒有”的情況。然後處理乾淨後對內部的程式總是not null的,不用管“沒有”。編譯器就負責保證那些not null的部分肯定不出問題。kotlin是這麼幹的。

    3)允許null,透過與語法糖的形式讓每次有null時的處理寫的方便點。比如js裡你可以這樣寫“(getUser(userId) || {}).name”或者“_.get(getUser(userId), ‘name’)”,這樣使用者找不到,至少能得到一個undefined的name,而不會NPE。簡短的語法糖可以提高開發者做處理的機率。上面的這段程式碼如果用java就得寫幾行,程式設計師也許會更傾向於漏掉。

    至於除0造成的問題,相對於null會少一些。只有遇到除0才會有問題。我所在領域見過的大多數程式根本不會做除法。但如果是資料分析等領域的,除0問題也會像null問題一樣噁心。你總是要定義資料除0表達什麼意思。也許就是一個錯誤需要報,也許是有實際含義的(比如垂直的斜率),你需要換一個方式表達它。

  • 中秋節和大豐收的關聯?
  • dietarysupplement是什麼意思?