昨天在做公司項目時,我在一處地方加了一個邏輯校驗,之后測了下發現在方法調用深處有一處NPE,來源於另一個同事的代碼。
其實NPE本應該是個Java編程中老掉牙的問題,但我覺得這一處錯誤還是比較典型的,值得一提。

這里的CycleTypeEnum是一個枚舉類型,code是枚舉中的一個int類型。而條件表達式右邊的cycleType是Product類的一個Integer類型。
業務上保證不了cycleType一定不為null,當一個Integer與一個int比較的時候,前者會拆箱為int,這一個過程也即調用intValue()。
這個地方代碼的改法一種就是將枚舉中的int類型code改為Integer,然后在這一處代碼用equals判斷。或者將Product類中的cycleType改為int類型。
但從軟件設計本身角度來說,應當豐富Product的類型,將cycleType的類型改為CycleTypeEnum,然后在那一處代碼直接判斷枚舉是否是同一個。
我覺得這個問題最大的點在於這種Integer和int的比較在JDK5之后有了自動拆箱,很多人會忽略潛在的NPE。
