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[]){
CaseModel cases=null;
cases.setName("張三");
System.out.println(cases.getName());
}
分析:聲明一個Person對象,並打印出該對象的中的Name名字。
說明:這個時候你的p就出現空指針異常,因爲你只是聲明瞭這個CaseModel 類型的對象並沒有創建對象,所以它的堆裏面沒有地址引用,切忌你要用對象掉用方法的時候一定要創建對象。 CaseModel cases = new CaseModel();