java空指針異常:java.lang.NullPointException

一.什麼是java空指針異常java

    咱們都知道java是沒有指針的,這裏說的"java指針"指的就是java的引用,咱們不在這裏討論叫指針究竟合不合適,而只是針對這個異常自己進行分析。空指針就是空引用,java空指針異常就是引用自己爲空,卻調用了方法,這個時候就會出現空指針異常。能夠理解,成員變量和方法是屬於對象的(除去靜態),在對象中才存在相對應的成員變量和方法,而後經過對象去調用這些成員變量和方法。對於空指針來講,它不指向任何對象,也就沒有所謂的成員變量和方法,這個時候用它去調用某些屬性和方法,固然會出現空指針異常。程序員

public class Test {
    private int a=1;
    private int b=2;
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Test t1 = new Test();
        Test t2 = null;
        System.out.println(t1.a);
        System.out.println(t2.a);
        System.out.println(t2.c());
    }
    public String c(){
        return "123";
    }
}

咱們分析上面這段示例代碼,在Test類中,有兩個成員變量a和b,和一個方法c()。而後在main()方法中,咱們建立了兩個對象t1和t2,其中t1指向經過構造方法實例出的Test對象,而t2只是聲明,並指向了空,並無指向實際的對象。調試的時候,第一條輸出語句是能夠經過編譯的,而執行到第二條輸出語句的時候,因爲空指針調用了不屬於它的a,程序終止,報告空指針異常。一樣,註釋第二條輸出語句,程序在執行到第三條輸出語句的時候,因爲調用了不屬於它的c()方法,會出現同樣的錯誤。服務器

 

二.如何解決session

    對於每個java程序員來講,幾乎都避免不了遇到空指針異常,特別是經驗不足的初學者。並且因爲它的調試和查找相對其它異常來講比較困難,經常須要花費很大的精力去解決它。eclipse

    首先認識一下java中的null設計

    null是Java中一個很重要的概念。null設計初衷是爲了表示一些缺失的東西,例如缺失的用戶、資源或其餘東西。可是,一年後,使人頭疼的空指針異常給Java程序員帶來很多的騷擾。指針

    null是java中的關鍵字,所以,它不能寫成NULL,Null,只能是null。調試

    null是全部引用類型的默認值,若是沒有讓一個引用指向一個實際存在的對象,它的默認值就是null。null本質上是一個值,這跟int的默認值是0,boolean的默認值是false同樣。如今,咱們一般都使用像eclipse等的集成開發環境進行開發,通常在定義變量的時候都會進行初始化(這也是寫代碼的一個良好的習慣),若是沒有進行初始化,系統會進行提示。code

報空指針異常的緣由有如下幾種: 對象

1字符串變量未初始化; 2接口類型的對象沒有用具體的類初始化,好比: List it;會報錯 List it = 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類型的對象並無建立對象,因此它的堆裏面沒有地址引用,切忌你要用對 象掉用方法的時候必定要建立對象。

相關文章
相關標籤/搜索