記錄一個使用三目表達(dá)式時遇到的問題:問題是由三目表達(dá)式與自動拆箱同時使用造成的(顯然自動拆箱并不是我自己主動調(diào)用的)
首先來看出問題的代碼:
Map<String, Integer> map = new HashMap<String, Integer>();
Integer i = (map != null ? map.get("test") : 0);
該段代碼運(yùn)行結(jié)果為空指針,既然報(bào)空指針說明是有null對象調(diào)用了某個方法,這段代碼中也就map.get("test")這一處調(diào)用,map已經(jīng)事先初始化過了所以不會是null。于是我將該class文件進(jìn)行了反編譯:
Map map = new HashMap();
Integer i = Integer.valueOf((map != null) ? ((Integer) map.get("test")).intValue() : 0);
可以看到, ((Integer) map.get("test")).intValue()這里的 map.get("test")的返回值是null,之后強(qiáng)轉(zhuǎn)為Integer還是null,所以null調(diào)用intValue()導(dǎo)致了空指針異常。
這里就要注意三目運(yùn)算符的語法規(guī)范了,簡單的來說就是:當(dāng)?shù)诙?,第三位操作?shù)分別為對象和基本類型時,其中的對象就會拆箱為基本類型。
所以,結(jié)果就是:由于使用了三目運(yùn)算符,并且第二、第三位操作數(shù)分別是對象和基本類型。所以對對象進(jìn)行拆箱操作,由于該對象為null,所以在拆箱過程中調(diào)用null.intValue()的時候就報(bào)了空指針。 所以正確的寫法應(yīng)該是:
Map<String, Integer> map = new HashMap<String, Integer>();
Integer i = (map != null ? map.get("test") : Integer.valueOf(0));
反編譯的結(jié)果為:
Map map = new HashMap();
Integer i = (map != null) ? (Integer) map.get("test") : Integer.valueOf(0);
可以看到,當(dāng)?shù)诙?,第三位操作?shù)都是對象時就不會進(jìn)行拆箱操作,也就不會出現(xiàn)上述問題。