天天看點

Optional亂用Empty之No value present前言問題描述結論

Optional亂用Empty之No value present前言問題描述結論

看到好多文章都是推薦采用Optinal的,而經常我遇到問題的時候就想:如果設計成optional的話就不會忽略這種NullPointException錯誤了。然而,optional并不是想用就随便用的。今天花了10分鐘追蹤一個bug,根源就是optional濫用。

API傳回失敗,沒有描述原因。看着蛋疼,因為公開的API不友善傳回錯誤詳情。于是查log,發現錯誤日志的message為:<code>No value present</code>。沒搞清楚這個錯誤資訊是哪一層跑出來的。需要進一步跟蹤。<code>A=&gt;B=&gt;C=&gt;D</code>,一直追蹤到C層才找到問題。

問題代碼如下:

這是一個建立工廠類,負責建立一個可以使用對象。所有的字段都采用了Opetional的包裹。這個是對象,理應不包含業務邏輯,應該沒有錯誤異常。如果有異常應該顯式的<code>throws</code>出來,不然這個非檢查性異常将在出現bug的時候難以定位。而這裡确實有一個異常沒有捕獲,而且也不能保證不會發生,甚至就是這裡引起的bug:<code>java.util.Optional#get</code>

源碼如下:

雖然沒有顯式的抛出異常,但在javadoc中寫清楚了會出現的問題。而我們這些新手則沒有認真看文檔就想當然的采用了。以為當内容為<code>null</code>的時候get出來的還是<code>null</code>。

Find Uage找這個Builder的用法發現:

這裡直接使用了<code>Optional.OfNullable</code>。然而,我們知道在下一步中會調用get,get的時候回判斷是否是<code>null</code>,<code>null</code>會抛出異常。這簡直就是自己挖坑,寫一個條件抛異常,而傳參數又專門去符合這個條件。前面也沒有校驗,外面也沒有捕獲異常,最終導緻異常直接一路抛出到API外層去了。

Optional不要濫用,Optional不是安全的随便用的,Optional用的時候記得捕獲異常。

唯有不斷學習方能改變!

-- <b>Ryan Miao</b>

繼續閱讀