廢話很少說,直接上題:java
提問:當 a=1,b=2 時,test1 方法的執行結果是什麼?思考一分鐘。面試
答案:微信
在使用三目運算符時,儘可能保證兩個返回值的類型一致,否則會觸發類型轉換,轉換規則以下:spa
若是返回值 X 和返回值 Y 是同種類型,那麼返回類型毫無疑問就是這種類型。指針
若是兩個返回值 X 和 Y 的類型不一樣,那麼返回值類型爲他們兩最接近的父類。舉例:code
// String 和 Boolean 都實現了 Serializable 接口
Serializable serializable = a == b ? "true" : Boolean.FALSE;
// 全部類都繼承了 Object 類
Object o = a == b ? new ArrayList<>() : new TernaryOperatorDemo();
複製代碼
對於基本數據類型,若是其中一個返回值 X 類型爲byte
、short
或者char
,另外一個返回值 Y 類型爲int
,那麼若在編譯期就能判斷出 Y 的取值範圍在 X 的取值範圍以內,則返回類型爲 X 的類型,反之則爲 Y 的類型。若是返回值 X 類型不爲以上幾種,則會觸發隱藏類型轉換。cdn
當基本數據類型和對象數據類型相遇時,三目運算符默認返回結果爲基本數據類型。對象
瞭解以上規則以後,咱們再看來一下 test1 方法。blog
private static void test1(int a, int b) {
// 觸發隱藏類型轉換,int 類型 9 轉爲 9.0D
System.out.println(a == b ? 9.9 : 9);
// 編譯期判斷,98 在 char 以內,轉爲 b
System.out.println(a == b ? 'a' : 98);
// 編譯期判斷,超出char範圍,統一轉 int
System.out.println(a == b ? 'a' : Integer.MAX_VALUE);
// 編譯期時沒法判斷 b 的取值,觸發隱藏類型轉換,統一轉 int
System.out.println(a == b ? 'a' : b);
System.out.println(a != b ? 'a' : b);
Map<String, Long> map = new HashMap<>();
map.put("b", 1L);
// 基本數據類型和對象數據類型相遇時,默認轉爲基本數據類,
// map.get("a") 返回 null,轉爲基本數據類型時,報空指針異常
System.out.println(map == null ? -1L : map.get("a"));
}
複製代碼
如何修改 test1 方法,使得代碼運行時不拋空指針異常,請至少提供一種解決方案。繼承
本文首發於我的微信公衆號:Coder小黑,歡迎你們掃碼關注哦。