一個容易忽略的Java空指標問題
阿新 • • 發佈:2018-12-23
今天有人提出了程式碼中一個的NullPointException問題。這類問題,很好解決,找到所在行,一看便知。
但是這次,有點意外。拋異常的行,只是一個簡單的Pojo的get、set方法。出錯的行在
a.setSize(b.getSize());
很自然的想到b會為null。但是前面的程式碼已經用過b了,也就是說,如果b是null。早就丟擲空指標了。a是新new的。不會是null。se**t方法內部也只是賦值。
this.size = size
一時間,我迷惑了。再仔細看程式碼,發現b.getSize獲取的型別是Long。而a.setSize,傳入的型別是long。
這種包裝類到基本型別的轉換,是會導致空指標的發生的。到此,bug是定位了。但是,你不想知道為什麼這種強轉會拋空指標嗎?首先,應該想到的是,通俗的說,NullPointException
1 astore_1 [l]
2 aload_1 [l]
3 invokevirtual java.lang.Long.longValue() : long [16]
6 lstore_2 [m]
原來這種強轉是呼叫了Long中的longValue()方法。自然符合用null物件呼叫方法,丟擲空指標異常,也就不奇怪了。