国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 開發(fā) > Java > 正文

Java異常處理之try...catch...finally詳解

2024-07-14 08:43:26
字體:
供稿:網(wǎng)友

異常處理機(jī)制已經(jīng)成為判斷一門編程語言是否成熟的標(biāo)準(zhǔn)之一,其對(duì)代碼的健壯性有很大影響。一直以來異常處理使用不是很得心應(yīng)手,今天對(duì)異常進(jìn)行了較為深入的學(xué)習(xí),這篇主要是對(duì)try…catch…finally的一個(gè)總結(jié)。

一.java繼承體系

Java語言為異常處理提供了豐富的異常類,這些類之間有嚴(yán)格的繼承關(guān)系。如圖:

Java,異常處理,try,catch,finally

從圖中我們可以看出,所有的類都是繼承于Throwable這個(gè)父類,java將所有的非正常情況分為兩種:Error(錯(cuò)誤)和Exception(異常),Error錯(cuò)誤一般是于虛擬機(jī)相關(guān)的問題,如系統(tǒng)崩潰、虛擬機(jī)錯(cuò)誤、動(dòng)態(tài)鏈接失敗等,這種錯(cuò)誤是無法恢復(fù)或不可能捕獲的,而我們能處理的是Exception類下的錯(cuò)誤。Exception則分為兩大類,RuntimeException(運(yùn)行時(shí)異常)和其他異常(Checked異常),其他異常(Checked異常)是各種形式的編譯錯(cuò)誤,是我們必須顯示處理才可以通過變異的;而運(yùn)行時(shí)錯(cuò)誤顧名思義就是程序已經(jīng)通過了編譯,在運(yùn)行時(shí)出現(xiàn)的錯(cuò)誤,若是對(duì)這些異常置之不理會(huì)導(dǎo)致程序停止運(yùn)行、占用資源無法釋放甚至導(dǎo)致系統(tǒng)崩潰。

二.java異常處理機(jī)制及實(shí)現(xiàn)方法

1.主要依賴于try、catch、finally、throw和throws這五個(gè)關(guān)鍵字。(throw和throws本篇不涉及)

2.try…catch…finally處理機(jī)制:try關(guān)鍵字后跟一個(gè)花括號(hào)栝起的代碼塊(即使該代碼塊只有一行也不能省略花括號(hào)),簡(jiǎn)稱try塊。catch對(duì)應(yīng)異常類型和代碼塊,用于表明更改catch塊用于處理該種類型的異常。一個(gè)try塊后可以跟多個(gè)catch塊。在catch塊后還可以跟一個(gè)finally塊,finally塊用于回收在try塊里打開的資源。

這樣講過于抽象,那我們看幾個(gè)例子:

e.g.1 try…catch語句塊

//功能:對(duì)輸入的兩個(gè)數(shù)進(jìn)行相除運(yùn)算public class DivTest {  public static void main(String[] args) {    try {      int a = Integer.parseInt(args[0]);      int b = Integer.parseInt(args[1]);      int c = a/b;      System.out.println("您輸入的兩個(gè)數(shù)相除的結(jié)果是:" + c);    } catch(IndexOutOfBoundsException ie) {      System.out.println("數(shù)組越界");    } catch(NumberFormatException ne) {      System.out.println("數(shù)字格式異常");    } catch(ArithmeticException ae) {      System.out.println("算術(shù)異常");    } catch(Exception e) {      System.out.println("未知異常");    }   }}

以上代碼我們看到,對(duì)不同的異常情況作了不同的處理:輸入?yún)?shù)不夠會(huì)發(fā)生數(shù)組越界異常、輸入?yún)?shù)不是數(shù)字發(fā)生數(shù)字格式異常、若輸入第二個(gè)數(shù)是0,則發(fā)生除0異常,調(diào)用算術(shù)異常進(jìn)行處理、出現(xiàn)其他異常時(shí)那么該異常對(duì)象必定是Exception類或其子類的實(shí)例,java調(diào)用Exception類對(duì)其進(jìn)行處理,前三種異常類均是RuntimeException的子類。在使用try…catch語句塊時(shí)需要知道或注意以下幾點(diǎn):

1) 處理過程:代碼在執(zhí)行的時(shí)候,進(jìn)入try塊,若是在try塊中出現(xiàn)了異常,系統(tǒng)會(huì)自動(dòng)生成一個(gè)一場(chǎng)對(duì)象,該對(duì)象被提交給java運(yùn)行時(shí)環(huán)境,這就是異常的拋出;在java運(yùn)行時(shí)環(huán)境收到異常對(duì)象時(shí)則把該對(duì)象交給catch塊處理,這個(gè)過程叫做異常的捕獲;若找到相應(yīng)的catch塊就執(zhí)行catch塊中的代碼,若沒有找到,則運(yùn)行時(shí)環(huán)境終止,程序也退出。 

2) 執(zhí)行一次try塊只執(zhí)行一個(gè)catch塊 

3) 有多個(gè)catch塊并有繼承關(guān)系的情況下必須先寫子類后寫父類(即先捕獲小異常再捕獲大異常),若寫反在編譯時(shí)就會(huì)報(bào)錯(cuò) 

4) Java7提供的多異常捕獲:在Java7之前,每一個(gè)catch塊只能捕獲一種異常,但從java7開始,一個(gè)catch塊可以捕獲多種類型的異常。在使用多異常捕獲應(yīng)注意兩點(diǎn):

  • (1) 多種異常之間用豎線( | )隔開 
  • (2) 多種異常對(duì)象被final隱式修飾,因此程序不能對(duì)其重新賦值

以下代碼是多異常捕獲的例子:

e.g.2

//多異常捕獲public class MultiExceptionTest {  public static void main(String[] args) {    try {      int a = Integer.parseInt(args[0]);      int b = Integer.parseInt(args[1]);      int c = a/b;      System.out.println("您輸入的兩個(gè)數(shù)相除的結(jié)果是:" + c);    } catch(IndexOutOfBoundsException|NumberFormatException|    ArithmeticException ie) {      System.out.println("數(shù)組越界或數(shù)字格式異常或算術(shù)異常");      ie = new ArithmeticExcrption("test");  //①    } catch(Exception e) {      System.out.println("未知異常");      e = new RuntimeException("test");  //②    }   }}

可以看出,以上代碼中,①號(hào)代碼是錯(cuò)誤的,因?yàn)閕e是被final隱式修飾的對(duì)象,②號(hào)代碼是正確的

3. 使用finally回收資源:有些時(shí)候我們?cè)趖ry塊中打開了一些物理資源(例如數(shù)據(jù)庫鏈接、網(wǎng)絡(luò)連接和磁盤文件等),這些資源都應(yīng)進(jìn)行顯示回收。有人說java不是有垃圾回收機(jī)制嗎?java的垃圾回收機(jī)制是自動(dòng)回收堆內(nèi)存中對(duì)象所占用的內(nèi)存,而物理資源是不會(huì)自動(dòng)回收的。

finally重點(diǎn)學(xué)習(xí)以下幾點(diǎn):

  • 1) 執(zhí)行過程以及引入finally的原因:finally最后執(zhí)行并且最后執(zhí)行,物理資源回收放在finally塊中的原因就是finally塊一定會(huì)被執(zhí)行。相反,若是放在try塊中,在執(zhí)行之前就出現(xiàn)異常則跳轉(zhuǎn)至catch塊中,則回收資源的代碼不會(huì)被執(zhí)行;同樣的,若是放在catch塊中,若不發(fā)生異常,那么catch塊就不會(huì)被執(zhí)行
  • 2) 若是在catch快中有return語句,則先執(zhí)行完finally中的程序后再回到catch塊中并執(zhí)行return語句
  • 3) 若是在finally中有return語句,那么try塊和catch塊中的return語句都會(huì)失效,不會(huì)被執(zhí)行
  • 4) 若在catch塊中強(qiáng)制退出虛擬機(jī),如使用System.exit(1)語句,則會(huì)直接退出程序,finally也不會(huì)得到執(zhí)行

e.g.3

//該類功能:打開a.txt文件,在finally塊中對(duì)資源進(jìn)行回收/* 對(duì)代碼中一些方法的解釋: * 所有異常都包含以下幾種訪問異常信息的常用方法: * getMessage():返回該異常的詳細(xì)描述字符串 * printStackTrace():將該異常的跟蹤棧信息輸出到標(biāo)準(zhǔn)錯(cuò)誤輸出 * printStaceTrace(PrintStack s):將該異常的跟蹤棧信息到執(zhí)行輸出流 * getStackTrace():返回該異常的跟蹤棧信息 **/public class FinallyTest {  public static void main(String[] args) {    FileInputStream fis = null;    try {      fis = new FileInputStream("a.txt");    }catch(IOException ioe) {      System.out.println(ioe.getMessage());      return;      //①      System.exit(1);  //②    }finally {      if(fis != null) {        try{          fis.close();        }catch(IOException ioe) {          ioe.printStackTrace();        }      }      System.out.println("執(zhí)行finally塊里的資源回收!");    }  }}

注釋掉②號(hào)代碼運(yùn)行以上程序,我們看到的結(jié)果是:

a.txt (系統(tǒng)找不到該文件。)
程序已經(jīng)執(zhí)行了finally里的資源回收!

注釋掉①號(hào)代碼運(yùn)行以上程序,我們看到的結(jié)果是:

a.txt (系統(tǒng)找不到該文件。)

4. 嵌套

例如e.g.3代碼所示,finally塊中還嵌套了一個(gè)try…catch語句塊,這種在try塊、catch塊或finally塊中包含完整的異常處理流程的情形被稱為異常的嵌套。一般對(duì)嵌套深度沒有限制,但是層次太深的嵌套會(huì)降低可讀性。

5.Java7的自動(dòng)關(guān)閉資源的try語句:

在java7之前,我們必須像e.g.3中的代碼一樣手動(dòng)關(guān)閉文件,回收資源。在Java7中增強(qiáng)了try語句的功能,它允許在try關(guān)鍵字后緊跟一對(duì)圓括號(hào),圓括號(hào)可以聲明、初始化一個(gè)或多個(gè)資源,此處的資源指的是那些必須在程序結(jié)束時(shí)顯示關(guān)閉的資源,try語句在該語句結(jié)束時(shí)自動(dòng)關(guān)閉這些資源。這些資源實(shí)現(xiàn)類必須實(shí)現(xiàn)AutoCloseable或Closeable接口,實(shí)現(xiàn)這兩個(gè)接口就必須實(shí)現(xiàn)close()方法。

注:Closeable是AutoCloseable接口的子接口,Closeable接口里的close()方法聲明拋出了IOException,因此它的實(shí)現(xiàn)類在實(shí)現(xiàn)close()方法時(shí)只能聲明拋出IOException或其子類;AutoCloseable接口里的close()方法聲明拋出了Exception,因此它的實(shí)現(xiàn)類在實(shí)現(xiàn)close()方法時(shí)能拋出任何異常。Java7幾乎把所有的“資源類”(包括文件IO的各種類、JDBC編程的Connection、Statement等接口)進(jìn)行了改寫,改寫后的資源類都實(shí)現(xiàn)了AutoCloseable或Closeable接口

e.g.4

//使用自動(dòng)回收資源的try語句public class AutoCloseTest {  public static void main(String[] args) throws IOException {    try(    //聲明、初始化兩個(gè)可關(guān)閉的資源,try語句會(huì)自動(dòng)關(guān)閉這兩個(gè)資源    BufferedReader br = new BufferedReader(    new FileReader("AutoCloseTest.java"));    PrintStream ps = new PrintStream(    new FileOutputStream("a.txt"))) {      //使用兩個(gè)資源      System.out.println(br.readLine());      ps.println("自動(dòng)關(guān)閉資源的try語句")    }  }}

以上try語句塊后的圓括號(hào)中聲明、初始化了兩個(gè)IO流,由于BufferedReader、PrintStream都實(shí)現(xiàn)了Closeable接口,所以try語句會(huì)自動(dòng)關(guān)閉它們。自動(dòng)關(guān)閉資源的try語句塊相當(dāng)于包含了隱式的finally塊用于關(guān)閉資源,這個(gè)try語句可以沒有catch塊也可以沒有finally塊,大大減少了代碼的長(zhǎng)度。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)VeVb武林網(wǎng)的支持。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到JAVA教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
伊人精品影院| 91极品在线| 女同一区二区免费aⅴ| 国产高清在线a视频大全| 国产色a在线观看| 国产精品黄页网站在线播放免费| 国产乱xxⅹxx国语对白| 国产免费视频在线| 国产精彩视频在线观看免费蜜芽| 97影院理论午夜| 亚洲欧美国产另类首页| 欧美日韩一区二区三区在线播放| 久久精品亚洲7777影院| 国产精品视频白浆合集| 在线观看av资源网| 成年网站免费入口在线观看| 天堂资源在线中文| 精品国内自产拍在线视频| 男人天堂v视频| 9999在线视频| 国产一二在线观看| 四虎成人精品在永久在线观看| 国产男女av| 四虎成人欧美精品在永久在线| 成网站在线观看人免费| 99re热视频在线| 午夜伦全在线观看| 老司机在线视频二区| 6699久久国产精品免费| 免费特级黄毛片| 在线国产91| 国产福利在线视频| 国产专区在线| 黄网站在线观看高清免费| 亚洲www色| 伊人色综合网| 国产福利小视频在线观看| 二人午夜免费观看在线视频| 日本福利在线| 欧美日韩在线资源| 日本aⅴ写真网站免费| 在线国产一级| 在线视频观看国产| 精品推荐国产麻豆剧传媒| 国产高清视频在线播放| 国产精品伦理一区二区三区| 国产剧情av在线| 黄色av网站在线免费观看| 日本视频在线观看一区二区三区| 69免费视频| 亚洲欧美自拍另类| 亚洲妇熟xxxx妇色黄| 亚洲电影先锋| 国产69精品久久久久孕妇国产69久久 | 国产高清自拍视频在线观看| 国产中文字幕av| 中文字幕免费中文| 国产黄色免费电影| 亚洲人成电影| 最好2018中文免费视频| 国产高潮av| 青青草原国产在线观看| 九九视频精品在线| 国产区在线视频| 日本电影全部在线观看网站视频| 六月天色婷婷| 国产a国产a国产a| www.jizz在线观看| 国产特黄在线| 国产网站av| 99在线播放| 黄网站在线观看高清免费| 午夜视频在线| 国产激情在线观看| 国产在线观看18| 伊人影院在线观看| 国产美女在线看| 亚洲电影视频在线| 国产激情视频在线观看| 黄色电影网站在线观看| √天堂资源中文www| 浪潮av一区| 国产激情视频一区二区三区| 精品全国在线一区二区| 天天噜天天色| 二区三区中文字幕| 国产精品扒开做爽爽爽的视频| 中文天堂av| 国产一区二区三区美女秒播| 精品视频三区| 国产麻豆综合视频在线观看| 国产不卡在线| 18加网站在线| 日本天堂影院在线视频| 国产精品偷乱一区二区三区| 精品国产白色丝袜高跟鞋| 狠狠干五月天| 欧美韩日国产| 青青草观看免费视频在线| 国产精品白浆视频免费观看| 亚洲www色| 精品三级久久久久久久电影聊斋| 成人免费一区二区三区牛牛 | 四虎成人免费| 国产黄大片在线观看画质优化| 欧美日韩**字幕一区| 中文字幕高清av| 久草一本av| av在线不卡网站| 国产高清视频在线| 国产一区二区三区美女秒播| 最近免费中文字幕大全免费第三页| 欧美日韩在线视频免费观看 | 18av在线播放| 在线午夜视频| 亚洲伊人网在线观看| 99高清免费国产自产拍| 国产欧美在线观看视频| 国产理论电影在线| 久久精品视频免费看| www.91av| www.xxx黄| av中文字幕在线看| 激情丁香婷婷| 国产成人综合亚洲欧美在| 国产网站麻豆精品视频| 国产在线视频福利| 午夜国产视频| 91美女主播在线视频| 精品视频三区| 天天干天天摸| 国产毛片毛片| 国产精品日日爱| av片在线观看| 九九热视频免费观看| 自拍av在线| 在线观看国产福利视频| 久久久久久久久久久久网站| √天堂资源地址在线官网| 国产黄色av免费看| 天堂在线国产| 狠狠操天天操夜夜操| 精品51国产黑色丝袜高跟鞋| аⅴ成人天堂中文在线| 国产麻豆精品入口在线观看| 国产极品一区二区三区| 欧美视频免费一区二区三区| 1区不卡电影| gogo在线高清视频| 国产卡1卡2卡三卡在线| 精品美女调教视频| 天堂中文在线视频| 久久久久久久久免费视频| 国产天堂在线| 黄色在线视频观看网站| 18 激情视频在线| 国产免费高清| 在线中文字幕第一页| 激情视频国产| 在线视频1区2区| 国产精品视频流白浆免费视频| 就爱干草视频| av在线资源网| 国产激情小视频在线| 青草在线视频在线观看| 精品亚洲综合| 国产黄色片中文字幕| 最近中文字幕在线中文视频| а√最新版地址在线天堂| 国产91足控脚交在线观看| 国产一区二区三区不卡免费观看| a视频在线观看| 国产天堂资源| 国产精品久久久精品a级小说| 成人精品福利| 成年人在线观看| 国产字幕在线看| 国产在线你懂得| 国产精品亚洲色图| 国产精彩视频在线观看免费蜜芽| 99热在线免费观看| 国产一二三四| 国产经典三级在线| 国产高清一区二区三区视频| 国产欧美黑人| 2020国产在线视频| 国产高清免费在线播放| 最好看更新中文字幕| 尤物网在线观看| 国产精品久久久久一区二区国产| 国产精品一卡二卡三卡| 国产网友自拍电影在线 | 免费网站看黄yyy222| 精品资源在线看| 国产一区精品| a中文在线播放| 国产欧美日韩专区| av首页在线| 狂野欧美性猛交xxxx乱大交| 国产理论片免费观看|