1. 程式人生 > >Java中equals方法造成空指標異常的原因

Java中equals方法造成空指標異常的原因

問題:

當查詢已修改的與未修改的做比較的時候,之前為null的值呼叫equals方法與其他值做比較的時候,會導致丟擲空指標異常

反思:

為了避免記憶體溢位,我們在無需類外呼叫的方法前,一般不加static關鍵字(因為靜態方法會常駐記憶體,其生存週期與整個專案的生存週期是一致的)所以,我們應該在為變數賦初值的時候,儘量不要使用null來賦初值,如果一定是null作為初值的情況,那麼在進行操作時,一定要先 Assert.isNull 一下,儘量避免對null進行操作。回到equals方法上,如果一個初值可能為空的物件例項,呼叫equals方法時,一定要遵循 “常量”.equals(變數) 或者 後輸入的.equals(之前的)。

關於null:

1、null是Java中的關鍵字,像public、static、final。它是大小寫敏感的,你不能將null寫成Null或NULL,編譯器將不能識別它們然後報錯。

2、就像每種原始型別都有預設值一樣,如int預設值為0,boolean的預設值為false,null是任何引用型別的預設值,不嚴格的說是所有object型別的預設值。就像你建立了一個布林型別的變數,它將false作為自己的預設值,Java中的任何引用變數都將null作為預設值。這對所有變數都是適用的,如成員變數、區域性變數、例項變數、靜態變數(但當你使用一個沒有初始化的區域性變數,編譯器會警告你)。為了證明這個事實,你可以通過建立一個變數然後列印它的值來觀察這個引用變數。

3、null既不是物件也不是一種型別,它僅是一種特殊的值,你可以將其賦予任何引用型別,你也可以將null轉化成任何型別。

4、null可以賦值給引用變數,你不能將null賦給基本型別變數,例如int、double、float、boolean。如果你那樣做了,編譯器將會報錯。

5、任何含有null值的包裝類在Java拆箱生成基本資料型別時候都會丟擲一個空指標異常。(例如Integer拆箱成int時)

6、如果使用了帶有null值的引用型別變數,instanceof操作將會返回false。(instanceof:用來在執行時指出物件是否是特定類的一個例項,例如:Integer num = null,那麼,呼叫 num instanceof Integer時會返回false)

7、不能呼叫非靜態方法來使用一個值為null的引用型別變數,它將會丟擲空指標異常;可以使用靜態方法來使用一個值為null的引用型別變數,因為靜態方法使用靜態繫結,不會丟擲空指標異常。

8、你可以使用==或者!=操作來比較null值,但是不能使用其他演算法或者邏輯操作,例如小於或者大於。跟SQL不一樣,在Java中null==null將返回true。