記錄一個(gè)使用三目表達(dá)式時(shí)遇到的問(wèn)題:?jiǎn)栴}是由三目表達(dá)式與自動(dòng)拆箱同時(shí)使用造成的(顯然自動(dòng)拆箱并不是我自己主動(dòng)調(diào)用的)
首先來(lái)看出問(wèn)題的代碼:
Map<String, Integer> map = new HashMap<String, Integer>();
Integer i = (map != null ? map.get("test") : 0);
該段代碼運(yùn)行結(jié)果為空指針部逮,既然報(bào)空指針說(shuō)明是有null對(duì)象調(diào)用了某個(gè)方法醇滥,這段代碼中也就map.get("test")這一處調(diào)用左电,map已經(jīng)事先初始化過(guò)了所以不會(huì)是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)算符的語(yǔ)法規(guī)范了,簡(jiǎn)單的來(lái)說(shuō)就是:當(dāng)?shù)诙ǘ睿谌徊僮鲾?shù)分別為對(duì)象和基本類型時(shí)况木,其中的對(duì)象就會(huì)拆箱為基本類型。
所以旬迹,結(jié)果就是:由于使用了三目運(yùn)算符火惊,并且第二、第三位操作數(shù)分別是對(duì)象和基本類型奔垦。所以對(duì)對(duì)象進(jìn)行拆箱操作屹耐,由于該對(duì)象為null,所以在拆箱過(guò)程中調(diào)用null.intValue()的時(shí)候就報(bào)了空指針椿猎。 所以正確的寫(xiě)法應(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ù)都是對(duì)象時(shí)就不會(huì)進(jìn)行拆箱操作鸵贬,也就不會(huì)出現(xiàn)上述問(wèn)題俗他。