日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java异常处理(2)--异常处理机制及自定义异常

發布時間:2023/12/2 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java异常处理(2)--异常处理机制及自定义异常 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在編寫程序時,經常要在可能出現錯誤的地方加上檢測的代碼,如進行x/y運算時,要檢測分母為0,數據為空,輸入的不是數據而是字符等。過多的if-else分支會導致程序的代碼加長、臃腫,可讀性差。因此采用異常處理機制。

Java采用的異常處理機制,是將異常處理的程序代碼集中在一起,與正常的程序代碼分開,使得程序簡潔、優雅,并易于維護。


Java提供的是異常處理的抓拋模型。

Java程序的執行過程中如出現異常,會生成一個異常類對象,該異常對象將被提交給Java運行時系統,這個過程稱為拋出(throw)異常。

異常對象的生成拋出:
①由虛擬機自動生成:程序運行過程中,虛擬機檢測到程序發生了問題,如果在當
前代碼中沒有找到相應的處理程序,就會在后臺自動創建一個對應異常類的實例
對象并拋出——自動拋出
②由開發人員手動創建:Exception exception = new ClassCastException();——創
建好的異常對象不拋出對程序沒有任何影響,和創建一個普通對象一樣

如果一個方法內拋出異常,該異常對象會被拋給調用者方法中處理。如果異常沒有在調用者方法中處理,它繼續被拋給這個調用方法的上層方法。這個過程將一直繼續下去,直到異常被處理。這一過程稱為捕獲(catch)異常。如果一個異常回main()方法,并且main()也不處理,則程序運行終止。


Java異常處理的方式

方式一:try-catch-finally
方式二:throws + 異常類型


通過try-catch-finally(finally可選)方式

try{//可能出現異常的代碼 }catch(異常類型1 變量名e){//處理異常的方式1 }catch(異常類型2 變量名e){//處理異常的方式2 } ...... finally{//一定會執行的代碼 }

如果明確知道產生的是何種異常,可以用該異常類作為catch的參數;也可以用其父類作為catch的參數。比 如 : 可 以 用 ArithmeticException 類 作 為 參 數 的 地 方 , 就 可 以 用RuntimeException類作為參數,或者用所有異常的父類Exception類作為參數。但不能是與ArithmeticException類無關的異常。NullPointerException(catch中的語句將不會執行)。

使用try將可能出現異常代碼包裝起來,在執行過程中,一旦出現異常, 就會生成一個對應異常類的對象,根據此對象的類型,去catch中進行匹配。一旦try中的異常對象匹配到某一個catch時, 就進入catch中進行異常的處理。處理完成,就跳出當前的try-catch結構(在沒有寫finally的情況)。繼續執行其后的代碼。

catch中的異常類型如果沒有子父類關系,則誰聲明在上,誰聲明在下無所謂。
catch中的異常類型如果存在子父類關系,則要求子類一定聲明在父類的上面,否則會報錯。

異常對象處理(一般寫在catch語句里面,如e.printStackTrace()):
①返回String的getMessage() ,獲取異常信息。
②沒有返回值的printStackTrace(),獲取異常類名和異常信息,以及異常出現在程序中的位置。

在try結構中聲明的變量,再出了try結構以后,就不能再被調用。

try-catch-finally結構可以嵌套。

使用try-catch-finally處理編譯時異常,是得程序在編譯時就不再報錯,但是運行時仍可能報錯。相當于我們使用try-catch-finally將一個編譯時可能出現的異常,延遲到運行時出現。
開發中,由于運行時異常比較常見,所以我們通常不針對運行時異常編寫try-catch-finally。而針對于編譯時異常,一定要考慮異常的處理。


通過throws方式

"throws 異常類型"寫在方法的聲明處,指明此方法執行時,可能會拋出的異常類型。一旦當方法體執行時,出現異常,會在異常代碼處生成一個異常類的對象,此對象滿足throws后寫的異常類型時,就會被拋出。異常代碼后續的代碼不再執行。

public void readFile(String file) throws FileNotFoundException {......// 讀文件的操作可能產生FileNotFoundException類型的異常FileInputStream fis = new FileInputStream(file);...... }

try-catch-finally真正地將異常給處理掉了。
throws的方式只是將異常拋給了方法的調用者,并沒有真正將異常處理掉。

重寫方法不能拋出比被重寫方法范圍更大的異常類型。在多態的情況下,對methodA()方法的調用-異常的捕獲按父類聲明的異常處理。

public class A {public void methodA() throws IOException {......} } public class B1 extends A {public void methodA() throws FileNotFoundException {......} } public class B2 extends A {public void methodA() throws Exception { //報錯......} }

如果父類中被重寫的方法沒有throws方式處理異常,則子類重寫的方法也不能使用throws,意味著如果子類重寫的方法中有異常,必須使用try-catch-finally方式處理。


手動拋出(生成創建)異常(throw)

Java異常類對象除在程序執行過程中出現異常時由系統自動生成并拋出,也可根據需要使用人工創建并拋出。

首先要生成異常類對象,然后通過throw語句實現拋出操作(提交給Java運行環境)。例如:

IOException e = new IOException(); throw e;

或者直接

throw new IOException();

用戶自定義異常類

一般地,用戶自定義異常類都是RuntimeException的子類。
自定義異常類必須繼承現有的異常類。
自定義異常類通常需要編寫幾個重載的構造器。
自定義異常需要提供serialVersionUID。
自定義的異常通過throw拋出。

例子

class MyException extends Exception {static final long serialVersionUID = 13465653435L;private int idnumber;public MyException(String message, int id) {super(message);this.idnumber = id;}public int getId() {return idnumber;} } public class MyExpTest {public void regist(int num) throws MyException {if (num < 0)throw new MyException("人數為負值,不合理", 3);elseSystem.out.println("登記人數" + num);}public void manager() {try {regist(100);} catch (MyException e) {System.out.print("登記失敗,出錯種類" + e.getId());}System.out.print("本次登記操作結束");} public static void main(String args[]) {MyExpTest t = new MyExpTest();t.manager();} }

總結

以上是生活随笔為你收集整理的Java异常处理(2)--异常处理机制及自定义异常的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。