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