在編寫程式的時候,尤其是在我們編寫Java
的時候,最容易出現一個異常那就是NullPointerException
異常,對於新手來說,最鬱悶的就是辛辛苦苦敲打出2千多行的代碼後,然後進行debug,卻沒想到彈出了一堆NullPointerException
。
而且最為鬱悶的是這個異常還是異常難發現的異常,簡單的說,這個異常情況是非常隱形!
那麼有什麼辦法可以避免產生這樣的異常呢?而這樣的異常它產生在什麼地方呢?
首先,在Java
中,我們常用的一個類便是String,在Sun公司提供的手冊上,可以看到String有一個NullPointerException
的異常拋出,另外的異常則來源於我們自己編寫的類被系統拋出了異常。
為什麼會導致這樣的問題?
首先,null指標的引用是因為我們在建立一個對象時,運用指派陳述式並非真正的將對象賦值給另外一個對象,而實際上則是Java
為了節省記憶體的開銷,隱性的將我們要被賦值的對象用指標指向了我們要賦值的那個對象,而Java
在頂層沒有提供給使用者指標的使用,所以在程式執行時我們就感到我們的對象被賦值了。
這是什麼意思?舉個例子來說
String test1 = "this is a test";
test1並非是個String 的對象,該String的真正對象是"this
is a
test",這個對象被放置在記憶體中的某個位置,並用了test1去指向該位置,於是我們就可以等價的理解test1就是這個String的對象。請記
住,在大多數補習班或者專業課裡面凡是談到String類的時候,講師都應該會有這方面的介紹,所以筆者在這裡便不再做過多的累述。
好了,既然這個是一個指標,那麼問題就來了,也就是說當你在接收一個值的時候,而那個值實際上時不存在的,換句話說也就是在記憶體中是沒有這個對象存在的話,那麼你的String類指標便不知道指向記憶體的何方,因此它會將NullPointerException
拋出,告訴使用者去檢查你的程式碼。
也就是說你用這樣的方法去使用這個類並且調用裡面的方法的時候系統就會拋出異常
舉個簡單的例子
public void test( String input ){
System.out.println( input.equals(
"test" );
};
然後在某個方法裡面調用這個方法
public void check() {
String get = null;//warning!
test( get
);//NullPointerException
!!!!
}
你要是這個地方不拋出異常你只管打死我好了,問題就出在這裡。系統被指派了一個根本不存在(只存在於你的概念中而不存在於記憶體中)的值或者對象,那麼系統就會因為找不到位置而拋出異常!
在這裡給各位朋友提點意見
1) 當一個對象可能被指向一個null的時候,應該對它進行
try-catch操作
2)如果嫌第一個手段極為麻煩,那麼試一試將對象的位置換一換,例如上面的例子中將例子換成"test".equals(input);那麼程式將不會拋出NullPointerException
這個異常,當然這個看起來有點怪怪。
3)
對你輸入的類型進行有效性檢查,如果前面兩種都不滿意的話,那麼在你每個接收輸入的地方都要進行類型檢查,並且記住一點優先檢查指標為空白的情況!
例如:檢察一個輸入的String類型的target變數是否為合法輸入的時候要先檢查
if( target != null
&& !target.isEmpty() )
一定要這樣寫,而不能 if( !target.isEmpty()
&& target != null
)這樣的話程式因為優先執行左邊的判斷語句,從而導致NullPointerException
的發生!!!這個一定要記住!