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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

异常处理:try-catch-finally与throws的区别及使用情况

發(fā)布時間:2025/3/17 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 异常处理:try-catch-finally与throws的区别及使用情况 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Error與Exception

Error:Java 虛擬機(jī)無法解決的嚴(yán)重問題。如: JVM系統(tǒng)內(nèi)部錯誤、資源耗盡等嚴(yán)重情況。Error類對象由 Java虛擬機(jī)生成并拋出,大多數(shù)錯誤與代碼編寫者所執(zhí)行的操作無關(guān)。
比如: StackOverflowError 和OOM(Out of memory Error)。一 般不編寫針對性的代碼進(jìn)行處理。

eg:棧溢出、堆溢出、虛擬機(jī)運(yùn)行錯誤等。

//Exception in thread "main" java.lang.StackOverflowError//1.棧溢出 // main(args);//2.堆溢出:java.lang.OutOfMemoryError // Integer[] arr = new Integer[1024*1024*1024];//1024*1024*1024個4字節(jié)

Exception:其它因編程錯誤或偶然的外在因素導(dǎo)致的一般性問題,可以使用針對性的代碼進(jìn)行處理。

例如:
空指針訪問
試圖讀取不存在的文件
網(wǎng)絡(luò)連接中斷
數(shù)組角標(biāo)越界等

1.異常的體系結(jié)構(gòu)

java.lang.Throwable;* |---java.lang.Error;* |---java.lang.Exception;:可以進(jìn)行異常的處理* |---編譯時異常(checked)* |---IOException* |---FileNotFoundException* |---ClassNotFoundException* |---運(yùn)行時異常(unchecked)* |---NullPointerException* |---ArrayIndexOutOfBoundsException* |---ClassCastException* |---NumberFormatException* |---InputMismatchException* |---ArithmeticException // 算數(shù)異常


藍(lán)色:非受檢異常(unchecked)
紅色:受檢異常(checked)
2.從程序執(zhí)行過程來看,分為:編譯時異常和運(yùn)行時異常

3.異常處理:抓拋模型
過程一:== “拋”==:程序在正常執(zhí)行過程中,一旦出現(xiàn)異常,就會在異常代碼處生成一個對應(yīng)異常的對象并將此對象拋出。
一旦拋出對象以后,其后的代碼就不再執(zhí)行。

/*關(guān)于異常對象的產(chǎn)生:①系統(tǒng)自動生成的異常對象②手動的生成一個異常對象,并拋出throw*/

過程二:“抓”:異常的處理方式:① try-catch-finally ② throws

4.異常處理方式一:

  • try-catch-finally 的使用
try{//可能會出現(xiàn)異常的代碼 }catch(異常類型1 變量名1){//處理異常的方式1 }catch(異常類型2 變量名2){//處理異常的方式2 }... finally{//一定會執(zhí)行的代碼 }

eg:

String str = "123";str = "abc";//外面聲明int num = 0;try { // int num = Integer.parseInt(str);//里面使用num = Integer.parseInt(str);System.out.println("-----1");} catch (NumberFormatException e) { // System.out.println("出現(xiàn)數(shù)制轉(zhuǎn)換異常");//String getMessage():System.out.println(e.getMessage());//printStackATrace():e.printStackTrace();} catch (NullPointerException e) {System.out.println("出現(xiàn)空指針異常");} catch (Exception e) {System.out.println("Exception父類放后面");}System.out.println(num);//try結(jié)構(gòu)里的不能調(diào)用System.out.println("-----2");

說明:
1).finally是可選的;
2).使用try將可能會出現(xiàn)異常的代碼包裝起來,在執(zhí)行過程中,一旦出現(xiàn)異常,就會生成一個對應(yīng)異常的對象,根據(jù)此對象的類型,去catch中進(jìn)行匹配;
3).一旦try中的異常對象匹配到某一個catch時,就進(jìn)入catch中進(jìn)行異常的處理,一旦處理完成,就跳出當(dāng)前的try-catch結(jié)構(gòu)(在沒有寫finally的情況下),繼續(xù)執(zhí)行后面的代碼;
4).catch中的異常類型如果沒有子父類關(guān)系,誰先聲明無所謂; catch中的異常類型如果滿足子父類關(guān)系,則要求子類一定聲明在父類上面;否則,報(bào)錯;
5).常用的異常對象處理的方式:①String getMessage(): ②printStackATrace():
6).在try結(jié)構(gòu)中聲明的變量,出了try結(jié)構(gòu)之后,就不能被調(diào)用;可以在try外面先聲明,在try內(nèi)部使用
7).try-catch-finally結(jié)構(gòu)可以嵌套

注:①使用try-catch-finally處理編譯時異常,使得編譯時不再報(bào)錯,但運(yùn)行時可能會出錯,相當(dāng)于將一個編譯時可能出現(xiàn)的異常,延遲到運(yùn)行時出現(xiàn)。
②開發(fā)中,由于運(yùn)行時異常比較常見,所以我們通常不針對運(yùn)行時異常編寫try-catch-finally,針對編譯時異常,一定要考慮異常處理。

5.異常處理方式二:

  • throws + 異常類型
    1).“throws + 異常類型”寫在方法的聲明處,致命此方法執(zhí)行時,可能會拋出異常類型,一旦當(dāng)方法體執(zhí)行時出現(xiàn)異常,仍會在異常代碼出生成一個異常的對象,此對象滿足throws后的異常類型時,就會被拋出。異常代碼后續(xù)的代碼,就不再執(zhí)行;
    2).try-catch-finally:真正的將異常給處理掉了。
    而throws方式只是將異常拋給了方法的調(diào)用者,并沒有真正將異常處理掉。
    3).開發(fā)中如何選擇使用try-catch-finally還是使用throws?
    a. 父類中被重寫的方法沒有throws方式處理異常,則子類重寫的方法也不能夠使用throws,意味著如果子類重寫方法中有異常,必須使用try-catch-finally方式處理;
    b. 執(zhí)行額方法中,先后又調(diào)用了另外的幾個方法,這幾個方法是遞進(jìn)關(guān)系的,我們建議這幾個方法使用throws的方式進(jìn)行處理。而執(zhí)行的方法a可以考慮try-catch-finally方式進(jìn)行處理。

eg:

//main()中使用try-catch-finally結(jié)構(gòu),不然繼續(xù)throws給JVM,套死了public static void main(String[] args) {ExceptionTest2 test = new ExceptionTest2();try {test.method1();} catch (IOException e) {e.printStackTrace();}} public static void method1() throws FileNotFoundException, IOException{File file = new File("hello.txt");FileInputStream fis = new FileInputStream(file);int data = fis.read();while (data != -1) {System.out.println((char) data);//Unhandled exception: java.io.IOExceptiondata = fis.read();}fis.close();}

tips:方法重寫的規(guī)則之一:子類重寫的方法拋出的異常類型不大于父類被重寫的方法拋出的異常類型.
eg:

class SuperClass{public void method() throws IOException {} } class SubCLass extends SuperClass{public void method() throws FileNotFoundException {} }

而要是在其他方法里調(diào)用method(),也必須處理異常,此時在main()之前/main()中直接try-catch-finally結(jié)構(gòu)處理異常。
eg:

public void display(SuperClass s){try{s.method();}catch(IOException e){e.printStackTrace();}}public static void main(String[] args) {OverrideTest test = new OverrideTest();test.display(new SubCLass());}

總結(jié)

以上是生活随笔為你收集整理的异常处理:try-catch-finally与throws的区别及使用情况的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。