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


1.什么是空指針

指針只存在於c語言中,Java中是沒有指針的,空指針就是空引用,java空指針異常就是引用本身為空,卻調用了方法,這個時候就會出現空指針異常。可以理解,成員變量和方法是屬於對象的(除去靜態),在對象中才存在相對應的成員變量和方法,然后通過對象去調用這些成員變量和方法。對於空指針來說,它不指向任何對象,也就沒有所謂的成員變量和方法,這個時候用它去調用某些屬性和方法,當然會出現空指針異常。下面這個例子可以看我的上一篇隨筆(1)

for(int i=0;i<arr.length;i++){

    arr[i] = new Student(); //這句容易丟

    請輸入java成績:

    arr[i].javascore=input.nextInt();    //NullPointerException

      請輸入數學成績

   arr[i].mathScore= input.nextInt();

      請輸入sql成績:

    arr[i].sqlScore = input.nextInt();

  }

如果arr【i】沒有實例化,由於空指針調用了不屬於的JavaScore這個屬性,程序終止,報告空指針異常。

下面我貼出一個網上的代碼:

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()方法,會出現一樣的錯誤。

2.如何處理解決空指針異常

    報空指針異常的原因

字符串變量未初始化; 

接口類型的對象沒有用具體的類初始化,比如: 

List it;會報錯 

List it = new ArrayList();則不會報錯了 

3當一個對象的值為空時,你沒有判斷為空的情況。

實際開發中,大多數的空指針異常主要與對象的操作相關。 

   下面列出可能發生空指針異常的幾種情況及相應解決方案: 

    代碼段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類型的對象並沒有創建對象,所以它的堆里面沒有地址引用,切忌你要用對 象掉用方法的時候一定要創建對象。

參考學習:https://www.cnblogs.com/ttflove/p/6033393.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM