在一次上線的過(guò)程中,通過(guò)觀察日志發(fā)現(xiàn)有java.lang.NullPointerException的異常出現(xiàn):
異常堆棧
但這個(gè)空指針異常并不是我們的服務(wù)拋出的,顯示的是下游服務(wù)拋出來(lái)的,但和下游服務(wù)的開發(fā)人員確認(rèn),他們最近沒(méi)有發(fā)布過(guò)服務(wù)。
仔細(xì)觀察日志發(fā)現(xiàn):我們的服務(wù)在對(duì)下游服務(wù)發(fā)起RPC調(diào)用時(shí),RPC框架在調(diào)用下游服務(wù)的client包時(shí),執(zhí)行了ListThriftCodec.write方法,而這個(gè)方法執(zhí)行到boxedLongToLong方法時(shí),拋出了java.lang.NullPointerException的異常。
觀察到這,初步判斷是:我們的服務(wù)在調(diào)用下游服務(wù)時(shí),給一個(gè)Long類型的參數(shù)傳了null到下游,導(dǎo)致RPC框架Long轉(zhuǎn)Long的時(shí)候拋出了空指針異常。
然后仔細(xì)觀察代碼發(fā)現(xiàn):我們對(duì)一個(gè)Long型參數(shù)沒(méi)有做判空,把它寫入到ArrayList中傳給了下游,所以就出現(xiàn)了上面的異常。