Java三元表示式中的陷阱
阿新 • • 發佈:2021-01-20
今天遇到一個奇怪的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乾貨,也會分享免費的學習資料課程和麵試寶典
回覆:【計算機】【設計模式】【面試】有驚喜哦