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


一、思考題

以下代碼可能有什么錯誤?為什么?

 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     }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM