java 異常處理機制,throws與throw,try-catch-finally
阿新 • • 發佈:2018-11-05
java 異常處理機制
- 在編寫程式時,經常要在可能出現錯誤的地方加上檢測的程式碼,如進行x/y運算時,要檢測分母為0,資料為空,輸入的不是資料而是字元等。過多的分支會導致程式的程式碼加長,可讀性差。因此採用異常機制。
1.Java異常處理
Java採用異常處理機制,將異常處理的程式程式碼集中在一起,與正常的程式程式碼分開,使得程式簡潔,並易於維護
- Java提供的是異常處理的抓拋模型。
- Java程式的執行過程中如出現異常,會生成一個異常類物件,該異常物件將被提交給Java執行時系統,這個過程稱為丟擲==(throw)==異常。
- 異常物件的生成
1.由虛擬機器自動生成:程式執行過程中,虛擬機器檢測到程式發生了問題,如果在當前程式碼中沒有找到相應的處理程式,就會在後臺自動建立一個對應異常類的例項物件並丟擲——自動丟擲
2.由開發人員手動建立:Exception exception = new ClassCastException();——建立好的異常物件不丟擲對程式沒有任何影響,和建立一個普通物件一樣 - 如果一個方法內丟擲異常,該異常物件會被拋給呼叫者方法中處理。如果異常沒有在呼叫者方法中處理,它繼續被拋給這個呼叫方法的上層方法。這個過程將一直繼續下去,直到異常被處理。這一過程稱為捕獲(catch)異常。
- 如果一個異常回到main()方法,並且main()也不處理,則程式執行終止。
- 程式設計師通常只能處理Exception,而對Error無能為力。
- 異常處理是通過try-catch-finally語句實現的。
try{ ...... //可能產生異常的程式碼 } catch( ExceptionName1 e ){ ...... //當產生ExceptionName1型異常時的處置措施 } catch( ExceptionName2 e ){ ...... //當產生ExceptionName2型異常時的處置措施 } [ finally{ ...... //無論是否發生異常,都無條件執行的語句 } ]
- try
捕獲異常的第一步是用try{…}語句塊選定捕獲異常的範圍,將可能出現異常的程式碼放在try語句塊中。 - catch (Exceptiontype e)
在catch語句塊中是對異常物件進行處理的程式碼。每個try語句塊可以伴隨一個或多個catch語句,用於處理可能產生的不同型別的異常物件。如果明確知道產生的是何種異常,可以用該異常類作為catch的引數;也可以用其父類作為catch的引數。
比如:可以用ArithmeticException類作為引數的地方,就可以用RuntimeException類作為引數,或者用所有異常的父類Exception類作為引數。但不能是與ArithmeticException類無關的異常,如NullPointerException(catch中的語句將不會執行)。 - 注:try是一個獨立的程式碼塊,在其中定義的變數只在該變數塊中有效。
如果在try以外繼續使用,需要在try建立引用。在try對其進行初始化。IO,Socket就會遇到。 - 捕獲異常的有關資訊:
與其它物件一樣,可以訪問一個異常物件的成員變數或呼叫它的方法。
getMessage() 獲取異常資訊,返回字串
printStackTrace() 獲取異常類名和異常資訊,以及異常出現在程式中的位置。返回值void。
- finally
A.捕獲異常的最後一步是通過finally語句為異常處理提供一個統一的出口,使得在控制流轉到程式的其它部分以前,能夠對程式的狀態作統一的管理。
B.不論在try程式碼塊中是否發生了異常事件,catch語句是否執行,catch語句是否有異常,catch語句中是否有return,finally塊中的語句都會被執行。
C.finally語句和catch語句是任選的
D.處理過程:
Try中檢測到異常會將異常物件傳遞給catch,catch捕獲到異常進行處理。
Finally裡通常用來關閉資源。比如:資料庫資源,IO資源等。
2.try-catch-finally的程式流程圖
3.關鍵解讀
4.demo
- 可以看我的其他部落格。
5.不捕獲異常時的情況
- 前面使用的異常都是RuntimeException類或是它的子類,這些類的異常的特點是:
即使沒有使用try和catch捕獲,Java自己也能捕獲,並且編譯通過 ( 但執行時會發生異常使得程式執行終止 )。 - 如果丟擲的異常是IOException等型別的非執行時異常,則必須捕獲,否則編譯錯誤。也就是說,我們必須處理編譯時異常,將異常進行捕捉,轉化為執行時異常