一、思考題
以下代碼可能有什么錯誤?為什么?
1 import java.util.HashMap; 2 import java.util.Map; 3 4 public class Test { 5 public static void main(String[] args) { 6 Map<String, Integer> map = new HashMap<>(); 7 map.put("heihaozi", 1); 8 Integer i = map != null ? map.get("a") : Integer.MAX_VALUE; 9 System.out.println(i); 10 } 11 }
可能有小伙伴認為沒什么問題,請再思考5秒鍾......
二、什么錯誤?
首先回答第一個問題,可能有什么錯誤,實踐出真知,我們直接運行一下就知道了。
JDK7,報出了空指針異常,截圖如下:
JDK8,沒有報異常,截圖如下:
綜上所述,在JDK7中,以上代碼會有空指針異常。
三、什么原因?
那么為什么會有空指針異常呢?讓我們反編譯一下。
JDK7編譯后反編譯的代碼:
可以看出,在JDK7中的三目運算時,其中的對象會被拆箱為基本類型進行操作。
在對象進行拆箱操作時,由於該對象為null,在拆箱過程中調用null.intValue()時就報了空指針異常。
JDK8編譯后反編譯的代碼:
可以看出,在JDK8中的三目運算時,其中的基本類型會被裝箱為對象進行操作,所以沒有報異常。
四、解決方案
還在使用JDK7的小伙伴注意了,為了避免空指針異常,三目運算符中要把基礎類型進行裝箱,譬如這樣:
1 public static void main(String[] args) { 2 Map<String, Integer> map = new HashMap<>(); 3 map.put("heihaozi", 1); 4 Integer i = map != null ? map.get("a") : Integer.valueOf(Integer.MAX_VALUE); 5 System.out.println(i); 6 }