Java中三目運算符不爲人知的坑

一、思考題

以下代碼可能有什麼錯誤?爲什麼?

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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章