-
1 # 庭博
-
2 # 此生唯一
異常機制是JAVA中比較常用的特性!
一般的程式因為網路延遲,引數錯誤,型別轉換等總是會有多種各樣的異常,而JAVA封裝了統一的異常處理,為JAVA程式的異常提供統一的處理方式!
JAVA異常機制是怎麼樣的呢?
所有的異常類都繼承自throwable父類,分為分為兩大類,分別是Error(錯誤)和Exception(異常),Error通常是我們不需要關心的虛擬機器,記憶體等錯誤,而exception分為執行時異常(RuntimeException)和非執行時異常!
執行時異常通常有:NullPointerException,IndexOutOfBoundsException,這些異常在編譯器是虛擬機器檢測不出來的,只有在執行時期才會丟擲,這類異常通常由程式設計人員自己製造,也只能自己避免!
非執行時異常通常有:IOException,SQLException等等,這類異常通常在編譯期就提示錯誤,透過IDE出現提示,一般容易避免!
程式碼中出現異常怎麼處理呢?
1,丟擲:使用throw丟擲給上一層進行處理,如果沒進行處理則繼續往上丟擲!
2,捕獲:使用try catch finally語句,將在try語句塊中捕獲的異常在catch中集中處理,而fanally是保證異常處理永遠會執行的機制,可用於釋放資源(檔案流,資料庫連線等)!
怎麼在程式中避免異常?
1,儘量別返回null,使用"",new物件等作為替代!
2,進行入參判斷,如有引數問題,儘早的return出引數錯誤資訊!
3,多列印日誌:這是查詢問題的前提,儘量在函數出入口都加上日誌!
4,對於迴圈等,先進行陣列,列表等的判斷!
5,使用equals方法,儘量在.前加入可控的變數,物件等!使用split等方法前,儘量先做判斷!
儘管如此,異常還是無可避免!只能在保證自己程式碼質量的同時,多采取一些補救措施!
累積的更多JAVA開發經驗,願意無償分享,此時不關注,更待何時???
-
3 # IT人劉俊明
Java的異常處理機制是Java語言的重要組成部分,要想理解Java異常處理機制就先要從Java異常處理的概念以及方式開始。在文章開始之前,我先給大家看一個程式:
如果你能清晰的描述出這個程式的執行結果,那麼這篇文章就可以不用讀了,否則就仔細的讀一下。
Java異常的概念是程式在執行過程中遇到不可預見的錯誤,這個概念中有兩點需要關注,一點是“程式在執行過程中”,這說明程式本身的語法是沒有問題的,另一點是“不可預見的錯誤”,這就說明異常的產生具有一定的偶然性。
Java的異常處理方式有兩個大的機制一個是try-catch機制,另一個是throws機制。try-catch機制簡單的說就是捕獲並處理異常,try-catch的用法非常靈活,既可以分層處理異常,也可以巢狀處理異常,看一個例子:
當try體中產生異常的時候,系統就會跳轉到catch體進行異常處理,在這個例子中一個大的try-catch中還嵌套了一個小的try-catch體來單獨處理一部分語句的異常,同時外部的try體還定義了兩個catch體與之匹配,分別處理不同的異常。注意,在排列的時候要注意順序,因為catch在處理異常的時候是就近匹配的,當程式匹配到一個catch體之後就不再繼續往下匹配了,所以一定要把Exception異常放到後面,否則其他的catch體就起不到作用了。
接下來就要看一下throws和throw這兩個關鍵字的作用了,簡單的說throws是宣告異常,而throw是丟擲異常物件。看一個例子:
注意throws的位置在方法的宣告處,而throw則在方法體內,throws後面跟的是異常的型別,而throw後面跟的則是異常的物件。注意在catch體內的throw語句雖然也會丟擲一個異常,但是此處的異常並不會丟擲到方法外部,這是一個需要注意的地方,看一個例子:
這個例子我們可以看到Foo方法並沒有宣告異常,程式依然可以執行,但是程式的第20行語句並不會得到執行,原因是程式在第11行由於throw e而退出了。
通常情況下,當一個方法宣告異常時,所有呼叫這個方法的方法要麼處理這個異常,要麼繼續宣告,不能視而不見,簡單的說,就是異常在傳遞的過程中不能無緣無故的消失,這是保證程式健壯性的一個非常重要的機制。
接下來就是自定義異常了,自定義異常有三個特點,分別是自己定義、自己丟擲、自己處理,系統並不會丟擲使用者的自定義異常,看一個例子:
自定義異常在實際的使用中還是比較常見的。
當然,在使用try-catch的過程中還有一個重要的結構就是finally體,finally體的作用是無論try體是否有異常產生,finally體的內容都會得到執行,當然也有例外,看一個例子:
這個例子中在try體內呼叫了exit()方法,導致系統直接退出了,從而略過了fianlly體,這是一個需要注意的地方,通常情況下,finally體用於資源的回收處理。
接下來說一下斷言(assert)的使用,在jdk1.4以後出現了斷言,斷言可以在程式中為程式設計師驗證各種假設,可以說斷言是對異常處理的一種輔助,看一個例子:
斷言的使用在做測試的時候還是比較常見的。
回覆列表
異常實際上是一個判斷語句,但是它又與一般的判斷語句不一樣。
因為別的判斷語句可以自己控制,它異常不行,它一般是對硬體上未可以知的判斷。
比如你的程式正確,但是你不知道網路是不是通的, 所以你只好預防,只要網路不通,我的程式就出現異常判斷出來,這樣看起來,寫得程式比較專業。
記憶體或其它硬體也差不多是一樣的情況!