三元表達式空指針問題
問題描述:
如下代碼标紅處出現空指針異常:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL9kEVPVTRqJGasdkY5ZlMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL1ETNzMzNzUTM2EjNwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
測試及定位問題:
情景一:将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
修正問題: