1. 程式人生 > 實用技巧 >Java三元表示式中的陷阱

Java三元表示式中的陷阱

今天遇到一個奇怪的Java三元表示式中的空指標異常。特此記錄。

程式碼

程式碼示意如下:

Integer itemVO = null;
Integer globleLatenessToleranceUseAlternate = null;
Integer latenessToleranceUseAlternate =
    (itemVO == null ? globleLatenessToleranceUseAlternate : itemVO.intValue());

從上面程式碼可以看出:當itemVO不為空時,就取itemVO的值;否則,就取globleLatenessToleranceUseAlternate的值。

原因

但問題就在globleLatenessToleranceUseAlternate。當itemVO為空時,如果取globleLatenessToleranceUseAlternate,並不會得到值null, 而是Java會把globleLatenessToleranceUseAlternate進行一個自動開箱拆箱處理。簡言之,取得是 globleLatenessToleranceUseAlternate.intValue(), 此時,因為globleLatenessToleranceUseAlternate 本身是 null,因此 globleLatenessToleranceUseAlternate.intValue() 導致了空指標因此。

解法

修改如下解決:

Integer itemVO = null;
Integer globleLatenessToleranceUseAlternate = null;
Integer latenessToleranceUseAlternate;

if (itemVO != null) {
    latenessToleranceUseAlternate = itemVO.intValue();
} else {
    latenessToleranceUseAlternate = globleLatenessToleranceUseAlternate;
}

值得注意的是,在新版的JDK和Eclipse中,會做出友好的提示,從而能夠有效規避上述問題。提示如下:

Null pointer access: This expression of type Integer is null but requires auto-unboxing

來源:https://waylau.com/trap-in-java-ternary-expressions/
歡迎關注公眾號 【碼農開花】一起學習成長
我會一直分享Java乾貨,也會分享免費的學習資料課程和麵試寶典
回覆:【計算機】【設計模式】【面試】有驚喜哦