1. 程式人生 > >空指標問題(java.lang.NullPointerException)

空指標問題(java.lang.NullPointerException)

 
在Java中對值為null的指標呼叫任何方法,就會引發空指標異常(java.lang.NullPointerException)。空指標異常絕對是Java中最難查詢和除錯的一種異常,你永遠無法得到任何有用的除錯資訊。通過個人日常總結和網上搜集整理,歸納如下,供大家參考。
空指標異常產生的主要原因如下:
所以在Java中一般報空指標異常的原因有以下幾種:
1字串變數未初始化;
2介面型別的物件沒有用具體的類初始化,比如:
List lt;會報錯
List lt = new ArrayList();則不會報錯了
3當一個物件的值為空時,你沒有判斷為空的情況。你可以試著把下面的程式碼前加一行程式碼:
if(rb!=null && rb!="")
改成:
if(rb==null);
if(rb!==null&&rb!="") 或者if((“”).equals(rb))

空指標的解決辦法:
       重點關注報錯發生的所在行,通過空指標異常產生的兩條主要原因診斷具體的錯誤。同時為了避免空指標的發生,最好在做判斷處理時將“null”或者空值放於設定的值之前。
常見空指標異常的簡要分析:
(1)空指標錯誤
    Java中的8種基本資料型別,變數的值可以有其預設值,加入沒有對其正常賦值,java虛擬機器是不能
正確編譯通過的,因此使用基本的Java資料型別一般不會是不會引起空指標異常的。實際開發中,大多數的空指標異常主要與物件的操作相關。

下面列出可能發生空指標異常的幾種情況及相應解決方案:
程式碼段1:
  out.println(request.getParameter("username"));
  分析:程式碼段1的功能十分簡單,就是輸出使用者輸入"username"的值。
       說明:看上去,上面的語句找不出什麼語法錯誤,而且在大多數情況下也遇不到什麼問題。但是,如果某個使用者在輸入資料時並沒有提供表單域"username" 的值,或通過某種途徑繞過表單直接輸入時,此request.getParameter("username")的值為空(注意不是空字串,是空物件 null。),out物件的println方法是無法直接對空物件操作的,因此程式碼段1所在的JSP頁面將會丟擲 "Java.lang.NullPointerException"異常。而且即使物件可能為空時,也呼叫Java.lang.Object或Object物件本身的一些方法如toString(), equal(Object obj)等操作。

程式碼段2:
  String userName = request.getParameter("username");
  If (userName.equals("root"))
  {....}
  分析:程式碼段2的功能是檢測使用者提供的使用者名稱,如果是使用者名稱稱為"root"的使用者時,就執行一些特別的操作。                                                                        

      說明:在程式碼段2中,如果有使用者沒有提供表單域"username"的值時,字串物件userName為null值,不能夠將一個null的物件與另一個物件直接比較,同樣,程式碼段2所在的JSP頁面就會拋空指標錯誤。

一個小技巧:如果要把某個方法的返回值與常量做比較,把常量放在前面,可以避免呼叫null物件的equals方法。譬如:  

 If ("root".equals(userName))
  {....}
   
  即使userName物件返回了null物件,這裡也不會有空指標異常,可以照常運轉。

程式碼段3:
  String userName = session.getAttribute("session.username").toString();
        分析:程式碼段3的功能是將session中session.username的值取出,並將該值賦給字串物件userName。
       說明:在一般情況下,如果在使用者已經進行某個會話,則不會出現什麼問題;但是,如果此時應用伺服器重新啟動,而使用者還沒有重新登入,(也可能是使用者關閉瀏覽器,但是仍開啟原來的頁面。)那麼,此時該session的值就會失效,同時導致session中的session.username的值為空。對一個為 null的物件的直接執行toString()操作,就會導致系統丟擲空指標異常。

程式碼段4:
public static void main(String args[]){ 

       Person p=null;

p.setName("張三"); 

    System.out.println(p.getName());

}

分析:宣告一個Person物件,並打印出該物件的中的Name名字。

說明:這個時候你的p就出現空指標異常,因為你只是聲明瞭這個Person型別的物件並沒有建立物件,所以它的堆裡面沒有地址引用,切忌你要用物件掉用方法的時候一定要建立物件。