簡體   English   中英

帶有三元運算符的 NullPointerException

[英]NullPointerException with ternary operator

為什么這樣做:

String a = null;
String b = a != null && a.equals("Nan") ? "Nan" : a;
System.out.println(b);

但這會產生 NPE:

Double value = null;
Double v = value != null && value.isNaN() ? 0.0 : value;
System.out.println(v);

將其重寫為:

Double value = null;
Double v;
if (value != null && value.isNaN()) {
    v = 0.0;
} else {
    v = value;
}

當然按預期工作。 但是為什么我在使用Double時使用三元/條件運算符得到 NPE 而在使用String時沒有 NPE? 我錯過了什么?

條件表達式的類型被推斷為double ,因此當程序嘗試將value (即null )拆箱為原始double時,您會得到一個NullPointerException

要使表達式具有Double結果(可以存儲null ),請將0.0轉換為Double

Double v = value != null && value.isNaN() ? (Double) 0.0 : value

請參閱第 15.25.2 節。 有關更多詳細信息,請參閱數值條件表達式

只是為了擴展上面接受的答案,但你也可以避免在這里投射。

   Double value = null;
   Double v = value != null && value.isNaN() ? Double.valueOf(0.0) : value;
   System.out.println(v);

Double.valueOf(0.0)將在第一種條件類型中提供一個Double ,這將使條件運算符評估為Double類型,因為value也是Double類型。 因此,如果條件的參與者都不是原始類型double ,它就不會嘗試任何拆箱操作,也不會拋出 NPE。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM