記錄一個Java三元表示式中的陷阱

語言: CN / TW / HK

今天遇到一個奇怪的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

參考引用