国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

淺談java異常處理之空指針異常

2019-11-26 13:38:30
字體:
來源:轉載
供稿:網友

聽老師說,在以后的學習中大部分的異常都是空指針異常。所以抽點打游戲的時間來查詢一下什么是空指針異常

一:空指針異常產生的主要原因如下:

(1)當一個對象不存在時又調用其方法會產生異常obj.method() // obj對象不存在

(2)當訪問或修改一個對象不存在的字段時會產生異常obj.method() // method方法不存在

(3)字符串變量未初始化;

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

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

當一個對象的值為空時,你沒有判斷為空的情況。你可以試著把下面的代碼前加一行代碼:

if(rb!=null && rb!="") 

改成:

if(rb==null); if(rb!==null&&rb!="") 或者if((“”).equals(rb)) 

空指針的解決辦法:

重點關注報錯發生的所在行,通過空指針異常產生的兩條主要原因診斷具體的錯誤。同時為了避免空指針的發生,最好在做判斷處理時將“null”或者空值放于設定的值之前。
 

常見空指針異常的簡要分析:

(1)空指針錯誤 Java.lang.NullPointerException

Java中的8種基本數據類型,變量的值可以有其默認值,加入沒有對其正常賦值,java虛擬機是不能正確編譯通過的,因此使用基本的Java數據類型一般不會是不會引起空指針異常的。實際開發中,大多數的空指針異常主要與對象的操作相關。

二、Java 異常處理機制

對于可能出現異常的代碼,有兩種處理辦法:

第一、在方法中用try...catch 語句捕獲并處理異常,catach 語句可以有多個,用來匹配多個異常。例如:

public void p(int x){try{...}catch(Exception e){...}finally{...}}

第二、對于處理不了的異常或者要轉型的異常,在方法的聲明處通過

throws 語句拋出異常。例如:

public void test1() throws MyException{...if(....){throw new MyException();}}

如果每個方法都是簡單的拋出異常,那么在方法調用方法的多層嵌套調用中,Java 虛擬機會從出現異常的方法代碼塊中往回找,直到找到處理該異常的代碼塊為止。然后將異常交給相應的catch 語句處理。如果Java 虛擬機追溯到方法調用棧最底部main()方法時,如果仍然沒有找到處理異常的代碼塊,將按照下面的步驟處理:

第一、調用異常的對象的printStackTrace()方法,打印方法調用棧的異常信息。

第二、如果出現異常的線程為主線程,則整個程序運行終止;如果非主線程,則終止該線程,其他線程繼續運行。

通過分析思考可以看出,越早處理異常消耗的資源和時間越小,產生影響的范圍也越小。因此,不要把自己能處理的異常也拋給調用者。

還有一點,不可忽視:finally 語句在任何情況下都必須執行的代碼,這樣可以保證一些在任何情況下都必須執行代碼的可靠性。比如,在數據庫查詢異常的時候,應該釋放JDBC 連接等等。finally 語句先于return 語句執行,而不論其先后位置,也不管是否try 塊出現異常。finally 語句唯一不被執行的情況是方法執行了System.exit()方法。System.exit()的作用是終止當前正在運行的Java 虛擬機。finally 語句塊中不能通過給變量賦新值來改變return的返回值,也建議不要在finally 塊中使用return 語句,沒有意義還容易導致錯誤。

最后還應該注意一下異常處理的語法規則:

第一、try 語句不能單獨存在,可以和catch、finally 組成

try...catch...finally、try...catch、try...finally 三種結構,catch 語句可以有一個或多個,finally 語句最多一個,try、catch、finally 這三個關鍵字均不能單獨使用。

第二、try、catch、finally 三個代碼塊中變量的作用域分別獨立而不能相互訪問。如果要在三個塊中都可以訪問,則需要將變量定義到這些塊的外面。

第三、多個catch 塊時候,Java 虛擬機會匹配其中一個異常類或其子類,就執行這個catch 塊,而不會再執行別的catch 塊。

第四、throw 語句后不允許有緊跟其他語句,因為這些沒有機會執行。

第五、如果一個方法調用了另外一個聲明拋出異常的方法,那么這個方法要么處理異常,要么聲明拋出。

2.2throw 和throws 關鍵字的區別:

throw 用來拋出一個異常,在方法體內。語法格式為:throw 異常對象。

throws 用來聲明方法可能會拋出什么異常,在方法名后,語法格式為:

throws 異常類型1,異常類型2...異常類型n。

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

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

A:不管對象是否為空就直接開始使用。

(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(), equal(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)空指針異常。

以上就是小編為大家帶來的淺談java異常處理之空指針異常全部內容了,希望大家多多支持武林網~

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 磴口县| 湘西| 湘乡市| 灵寿县| 鲁甸县| 新郑市| 香港 | 北票市| 靖宇县| 佳木斯市| 玉环县| 怀来县| 千阳县| 南靖县| 灵石县| 旺苍县| 武强县| 揭阳市| 峨眉山市| 湖口县| 江西省| 吉木萨尔县| 道真| 石城县| 安陆市| 新巴尔虎左旗| 江达县| 荆州市| 南投县| 忻州市| 吉木萨尔县| 凤山市| 会昌县| 青河县| 邵武市| 胶州市| 宝清县| 上蔡县| 佛山市| 兴业县| 沙洋县|