昨天下午生產環境跑job的時候出現空指標問題,本來嘛,空指標對於我們開發人員來說也是見怪不怪了,但空指標是比較頭疼的,不是很好排查。說奇怪是因為上午還是好好的:
報錯如下:
方法呼叫是這樣的:
類和方法宣告:
空指標報錯在if(fieldenum.getfieldid() == fieldid)這行,看起來怎麼都不會空指標啊,因為所有的列舉都不為空,傳過來的引數是基礎資料型別,更不可能空了,那為什麼會空指標呢?其他人也覺得不可思議,百思不得其解,一般那個檔案也不會有人去改,後來有人想到,會不會是**把某個列舉設定為空了,然後搜了下setfieldid方法,還真有地方呼叫,把第乙個列舉設空了,而且是我幹的:
當時是為了處理業務問題這麼寫,因為這個列舉是全域性的,所以別人在呼叫getfieldenumbyid方法時,有個列舉為空,於是產生空指標異常,又因為getfieldenumbyid方法只有那裡呼叫,我自己沒用,就沒發現問題,生產上跑了下我的job,再跑別人的那個job就有問題了,上午是好的是因為我的job上午沒有觸發。
說到這裡,就有疑問了,乙個long和乙個long比較,當long為空時,為什麼會空指標呢?想到之前了解到的自動拆箱和裝箱:當把乙個基礎型別賦值給包裝器型別,會自動裝箱,呼叫valueof方法,當把乙個包裝器型別給基礎型別,會自動拆箱,呼叫value方法,由於物件是空的,呼叫方法也就空指標了:
debug:
1.long物件不為空
2.long物件為空,沒有進斷點,直接就空指標了
3.兩個都是包裝器型別,可以看到,第14行不會對a進行拆箱,所以不會空指標
希望此文能讓你對自動拆裝箱有一些認識,我們在以後的開發中多注意。了解原理,賦能自己。
記一次自動拆裝箱造成空指標問題
如下 test方法體定義形參型別為int,但是實參確實integer類,一般情況下這麼傳值是沒有問題的,但是如果integer是null就會產生空指標問題,在當前 中 寫的很明顯,比較容易看出問題,但是真實的業務 都是從介面傳值的,需要聯絡上下文語境才能知道i的值,所以產生空指標的時候可能會比較費解...
記一次npm的奇怪bug
近幾天npm不知怎麼了不能安裝包了,連cnpm都不能安裝了,於是開始開 ku 心 bi 的除錯。網上的方法基本上全都試過了,結果出現了這個東西 這是讓我刮獎嗎?google一下,還真有這樣的錯誤,好像是埠被占用了。好嗎,三下五除二改下埠,發現還是不行。仔細觀察發現網上貼出來的錯誤跟我的錯誤還不一樣,...
記一次ES查詢資料突然變為空的問題
使用elasticsearch儲存訂單的主要資訊,document內的field,基本上是long或keyword,建立索引的order.json檔案如下 status createtime uid payment commentstatus refundstatus 某天發現有個查詢功能 單獨使用...