javanull 指標異常的分析(1)
JAVA語言中有“異常機制”來處理常式中的特殊情況,例如被除數為零就是一種“異常情況”。
null 指標異常java.lang.NullPointerException是很常見的一種異常,我們來談論一下它的分析方法。
使用基本的JAVA資料類型,變數的值要麼已經是預設值,如果沒有對其正常賦值,程式便不能通過編譯,因此使用基本的JAVA資料類型(double,float,boolean,char,int,long)一般不會引起null 指標異常。由此可見,null 指標異常主要跟與對象的操作相關。
下面列出了可能發生null 指標異常的幾種情況,我們來看看:
程式碼片段1(JSP):
out.println(request.getParameter("username"));
這是不管對象是否為空白,就直接開始使用的情況。
程式碼片段1的功能十分簡單,就是輸出使用者輸入的表單域"username"的值。
看上去,上面的語句找不出什麼語法錯誤,而且在大多數情況下也遇不到什麼問題。但是,如果某個使用者在輸入資料時並沒有提供表單域"username"的值,或通過某種途徑繞過表單直接輸入時,此時request.getParameter("username")的值為空白(不是Null 字元串,是Null 物件null。),out對象的println方法是無法直接對Null 物件操作,因此程式碼片段1所在的JSP頁面將會拋出"java.lang.NullPointerException"異常。
即使對象可能為空白時,也調用java.lang.Object或Object對象本身的一些方法如toString(), equals(Object obj)等操作。
程式碼片段2(JSP):
String userName = request.getParameter("username");
If (userName.equals("root"))
{....}
程式碼片段2的功能是檢測使用者提供的使用者名稱,如果是使用者名稱稱為"root"的使用者時,就執行一些特別的操作。
在程式碼片段2中,如果有使用者沒有提供表單域"username"的值時,字串對象userName為null值,不能夠將一個null的對象與另一個對象直接比較,同樣,程式碼片段2所在的JSP頁面就會拋出(java.lang.NullPointerException)null 指標錯誤。
Javanull 指標異常的分析(2)
null 指標異常java.lang.NullPointerException是很常見的一種異常,我們接著"Javanull 指標異常的分析(1)"這篇文章來討論這一異常的分析方法。
程式碼片段3(JSP):
String userName = session.getAttribute("session.username").toString();
程式碼片段3的功能是將session中session.username的值取出,並將該值賦給字串對象 userName。
在一般情況下,如果在使用者已經進行某個會話,則不會出現什麼問題;但是,如果此時應用伺服器重新啟動,而使用者還沒有重新登入,(也可能是使用者關閉瀏覽器,但是仍開啟原來的頁面。)那麼,此時該session的值就會失效,同時導致session中的session.username的值為空白。對一個為null的對象的直接執行toString()操作,就會導致系統拋出(java.lang.NullPointerException)null 指標異常。
解決方案:
為了確保進行操作或引用的對象非空,假若我們要對某對象進行操作或引用,我們首先去檢查該對象是否已經執行個體化且不為空白;並且在系統中加入針對對象為空白時情況的處理。如:採用String對象儲存使用者提交的結果;在如果涉及對象的操作時,先檢測其是否為空白後,檢查到對象為空白後,可再選擇進行以下任一種處理方式:
處理方式(1):檢查到對象為空白時,設定對象值為空白字串或一個預設值;
處理方式(2):檢測到對象為空白時,根本不執行某操作,直接跳轉到其他處理中。
處理方式(3):檢查到對象為空白時,提示使用者操作有錯誤。
將程式碼片段2按以上方式進行改寫,得到:
方式1:
String userName = request.getParameter("username");
// 該變數值為空白時,轉化為預設Null 字元串
If (userName == null)
userName = "";
If (userName.equals("root"))
{..........}
方式2:
String userName = request.getParameter("username");
// 該變數值為空白時,轉化為預設Null 字元串,不執行有關操作。
If (usreName != null)
{
If (userName.equals("root"))
{..........}
}
方式3:
String userName = request.getParameter("username");
// 該變數值為空白時,轉化為預設Null 字元串,不執行有關操作。
If (userName == null)
{
// 提示使用者輸入資訊為空白
}
實際中,上面提供到三種處理方式也同樣適用於其他異常的處理:
1.檢查到異常出現,設定對象值為空白字串或一個預設值;
2.檢測到異常出現,根本不執行某操作,直接跳轉到其他處理中。
3.檢查到異常出現,提示使用者操作有錯誤。