天天看點

三元表達式空指針問題

三元表達式空指針問題

問題描述:

如下代碼标紅處出現空指針異常:

三元表達式空指針問題

測試及定位問題:

情景一:将num指派為20,将flag指派為true

三元表達式空指針問題

正常輸出10

情景二:将num指派為null,将flag指派為true

三元表達式空指針問題

此時可以看到編譯器給出的警告提示,num處會發生拆箱操作,但是結果依然運作正常,因為三元表達式在條件為true短路則不會執行到num處。

情景三:将num指派為null,将flag指派為false

三元表達式空指針問題

此時可以看到編譯器給出的警告提示,num處會發生拆箱操作,執行程式發生空指針異常,因為三元表達式在條件為false時執行到num處進行拆箱操作,也就是Integer的intValue()方法。

情景四:将num指派為null,将flag指派為true,num和10調換位置

三元表達式空指針問題

此時可以看到編譯器給出的警告提示,num處會發生拆箱操作,執行程式發生空指針異常,因為三元表達式在條件為true時執行到num處進行拆箱操作,也就是Integer的intValue()方法。

情景五:将flag指派為true

三元表達式空指針問題

正常輸出null

綜上來看,三元表達式中條件判斷後,如果兩個結果中不直接寫null且同時存在基本類型和包裝類型的情況下,會發生自動裝箱或自動拆箱操作,比如情景三和情景四,是以出現這種代碼最好使用包裝類。

Java規範

https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.25

修正問題:

三元表達式空指針問題