[英]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.