java.lang.NullPointerException的分析

來源:互聯網
上載者:User
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.檢查到異常出現,提示使用者操作有錯誤。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.