空指標異常空指標異常產生的主要原因如下:(1) 當一個物件不存在時又呼叫其方法會產生異常 obj.method() // obj物件不存在(2) 當訪問或修改一個物件不存在的欄位時會產生異常 obj.method() // method方法不存在 具體情況如下:空指標錯誤( Java.lang.NullPointerException) 使用基本的Java資料型別,變數的值要麼已經是預設值,如果沒有對其正常賦值,程式便不能透過編譯,因此使用基本的Java資料型別(double,float,boolean,char,int,long)一般不會引起空指標異常。由此可見,空指標異常主要跟與物件的操作相關。 下面先列出了可能發生空指標異常的幾種情況及相應解決方案:情況一:不管物件是否為空就直接開始使用。 (JSP)程式碼段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(), equals(Object obj)等操作。(JSP)程式碼段2: String userName = request.getParameter("username"); If (userName.equals("root")) {....}描述: 程式碼段2的功能是檢測使用者提供的使用者名稱,如果是使用者名稱稱為"root"的使用者時,就執行一些特別的操作。說明: 在程式碼段2中,如果有使用者沒有提供表單域"username"的值時,字串物件userName為null值,不能夠將一個null的物件與另一個物件直接比較,同樣,程式碼段2所在的JSP頁面就會丟擲(Java.lang.NullPointerException)空指標錯誤。(JSP)程式碼段3: String userName = session.getAttribute ("session.username").toString();描述: 程式碼段3的功能是將session中session.username的值取出,並將該值賦給字串物件 userName。說明: 在一般情況下,如果在使用者已經進行某個會話,則不會出現什麼問題;但是,如果此時應用伺服器重新啟動,而使用者還沒有重新登入,(也可能是使用者關閉瀏覽器,但是仍開啟原來的頁面。)那麼,此時該session的值就會失效,同時導致session中的session.username的值為空。對一個為 null的物件的直接執行toString()操作,就會導致系統丟擲(Java.lang.NullPointerException)空指標異常。 解決方案: 為了確保進行操作或引用的物件非空,假若我們要對某物件進行操作或引用,我們首先去檢查該物件是否已經例項化且不為空;並且在系統中加入針對物件為空時情況的處理。 如:採用String物件儲存使用者提交的結果;在如果涉及物件的操作時,先檢測其是否為空後,檢查到物件為空後,可再選擇進行以下任一種處理方式: 處理方式 1) 檢查到物件為空時,設定物件值為空字串或一個預設值; 處理方式 2) 檢測到物件為空時,根本不執行某操作,直接跳轉到其他處理中。 處理方式 3) 檢查到物件為空時,提示使用者操作有錯誤。 將程式碼段2按以上方式進行改寫,得到:方式1: String userName = request.getParameter("username"); // 該變數值為空時,轉化為預設空字串 If (userName == null) userName = ""; If (userName.equals("root")) {..........}方式2: String userName = request.getParameter("username"); // 該變數值為空時,轉化為預設空字串,不執行有關操作。 If (usreName != null) { If (userName.equals("root")) {..........} }方式3: String userName = request.getParameter("username"); // 該變數值為空時,轉化為預設空字串,不執行有關操作。 If (usreName == null) { // 提示使用者輸入資訊為空 }實際中,上面提供到三種處理方式也同樣適用於其他異常的處理:異常處理方式 1) 檢查到異常出現,設定物件值為空字串或一個預設值;異常處理方式 2) 檢測到異常出現,根本不執行某操作,直接跳轉到其他處理中。異常處理方式 3) 檢查到異常出現,提示使用者操作有錯誤。
空指標異常空指標異常產生的主要原因如下:(1) 當一個物件不存在時又呼叫其方法會產生異常 obj.method() // obj物件不存在(2) 當訪問或修改一個物件不存在的欄位時會產生異常 obj.method() // method方法不存在 具體情況如下:空指標錯誤( Java.lang.NullPointerException) 使用基本的Java資料型別,變數的值要麼已經是預設值,如果沒有對其正常賦值,程式便不能透過編譯,因此使用基本的Java資料型別(double,float,boolean,char,int,long)一般不會引起空指標異常。由此可見,空指標異常主要跟與物件的操作相關。 下面先列出了可能發生空指標異常的幾種情況及相應解決方案:情況一:不管物件是否為空就直接開始使用。 (JSP)程式碼段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(), equals(Object obj)等操作。(JSP)程式碼段2: String userName = request.getParameter("username"); If (userName.equals("root")) {....}描述: 程式碼段2的功能是檢測使用者提供的使用者名稱,如果是使用者名稱稱為"root"的使用者時,就執行一些特別的操作。說明: 在程式碼段2中,如果有使用者沒有提供表單域"username"的值時,字串物件userName為null值,不能夠將一個null的物件與另一個物件直接比較,同樣,程式碼段2所在的JSP頁面就會丟擲(Java.lang.NullPointerException)空指標錯誤。(JSP)程式碼段3: String userName = session.getAttribute ("session.username").toString();描述: 程式碼段3的功能是將session中session.username的值取出,並將該值賦給字串物件 userName。說明: 在一般情況下,如果在使用者已經進行某個會話,則不會出現什麼問題;但是,如果此時應用伺服器重新啟動,而使用者還沒有重新登入,(也可能是使用者關閉瀏覽器,但是仍開啟原來的頁面。)那麼,此時該session的值就會失效,同時導致session中的session.username的值為空。對一個為 null的物件的直接執行toString()操作,就會導致系統丟擲(Java.lang.NullPointerException)空指標異常。 解決方案: 為了確保進行操作或引用的物件非空,假若我們要對某物件進行操作或引用,我們首先去檢查該物件是否已經例項化且不為空;並且在系統中加入針對物件為空時情況的處理。 如:採用String物件儲存使用者提交的結果;在如果涉及物件的操作時,先檢測其是否為空後,檢查到物件為空後,可再選擇進行以下任一種處理方式: 處理方式 1) 檢查到物件為空時,設定物件值為空字串或一個預設值; 處理方式 2) 檢測到物件為空時,根本不執行某操作,直接跳轉到其他處理中。 處理方式 3) 檢查到物件為空時,提示使用者操作有錯誤。 將程式碼段2按以上方式進行改寫,得到:方式1: String userName = request.getParameter("username"); // 該變數值為空時,轉化為預設空字串 If (userName == null) userName = ""; If (userName.equals("root")) {..........}方式2: String userName = request.getParameter("username"); // 該變數值為空時,轉化為預設空字串,不執行有關操作。 If (usreName != null) { If (userName.equals("root")) {..........} }方式3: String userName = request.getParameter("username"); // 該變數值為空時,轉化為預設空字串,不執行有關操作。 If (usreName == null) { // 提示使用者輸入資訊為空 }實際中,上面提供到三種處理方式也同樣適用於其他異常的處理:異常處理方式 1) 檢查到異常出現,設定物件值為空字串或一個預設值;異常處理方式 2) 檢測到異常出現,根本不執行某操作,直接跳轉到其他處理中。異常處理方式 3) 檢查到異常出現,提示使用者操作有錯誤。