1. 程式人生 > >一個容易忽略的Java空指標問題

一個容易忽略的Java空指標問題

今天有人提出了程式碼中一個的NullPointException問題。這類問題,很好解決,找到所在行,一看便知。

但是這次,有點意外。拋異常的行,只是一個簡單的Pojogetset方法。出錯的行在

a.setSize(b.getSize());

很自然的想到b會為null。但是前面的程式碼已經用過b了,也就是說,如果bnull。早就丟擲空指標了。a是新new的。不會是null。se**t方法內部也只是賦值。

this.size = size

一時間,我迷惑了。再仔細看程式碼,發現b.getSize獲取的型別是Long。而a.setSize,傳入的型別是long

這種包裝類到基本型別的轉換,是會導致空指標的發生的。到此,bug是定位了。但是,你不想知道為什麼這種強轉會拋空指標嗎?首先,應該想到的是,通俗的說,NullPointException

的一般情況,就是用null物件呼叫方法。那麼自然聯想到,這裡究竟是呼叫了什麼方法?很簡單,看編譯過的位元組碼便知:

  1  astore_1 [l]
     2  aload_1 [l]
     3  invokevirtual java.lang.Long.longValue() : long [16]
     6  lstore_2 [m]

原來這種強轉是呼叫了Long中的longValue()方法。自然符合用null物件呼叫方法,丟擲空指標異常,也就不奇怪了。