黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學(xué)習(xí)攻略 java異常處理機(jī)制詳解(一)

java異常處理機(jī)制詳解(一)

更新時(shí)間:2019-08-28 11:36:28 來源:動(dòng)力節(jié)點(diǎn) 瀏覽2662次

  


今天動(dòng)力節(jié)點(diǎn)java學(xué)院小編為大家介紹“java異常處理機(jī)制詳解”,希望對(duì)大家有幫助,下面就隨小編一起看看java異常處理機(jī)制詳解吧。


異常機(jī)制已經(jīng)成為判斷一門編程語言是否成熟的標(biāo)準(zhǔn),異常機(jī)制可以使程序中異常處理代碼和正常業(yè)務(wù)代碼分離,保證程序代碼更加優(yōu)雅,并提高程序健壯性。


  Java異常機(jī)制主要依賴于try、catch、finally、throw、throws五個(gè)關(guān)鍵字。


  1、try:它里面放置可能引發(fā)異常的代碼。


  2、catch:后面對(duì)應(yīng)異常類型和一個(gè)代碼塊,用于表明該catch塊用于處理這種類型的代碼塊,可以有多個(gè)catch塊。


  3、finally:主要用于回收在try塊里打開的物力資源(如數(shù)據(jù)庫連接、網(wǎng)絡(luò)連接和磁盤文件),異常機(jī)制總是保證finally塊總是被執(zhí)行。只有finally塊,執(zhí)行完成之后,才會(huì)回來執(zhí)行try或者catch塊中的return或者throw語句,如果finally中使用了return或者 throw等終止方法的語句,則就不會(huì)跳回執(zhí)行,直接停止。


  4、throw:用于拋出一個(gè)實(shí)際的異常,可以單獨(dú)作為語句使用,拋出一個(gè)具體的異常對(duì)象。


  5、throws:用在方法簽名中,用于聲明該方法可能拋出的異常。


  Java的異常分為兩種,checked異常(編譯時(shí)異常)和Runtime異常(運(yùn)行時(shí)異常)


  1、 java認(rèn)為checked異常都是可以再編譯階段被處理的異常,所以它強(qiáng)制程序處理所有的checked異常,而Runtime異常無須處理,java程序必須顯式處理checked異常,如果程序沒有處理,則在編譯時(shí)會(huì)發(fā)生錯(cuò)誤,無法通過編譯。


  2、 checked異常體現(xiàn)了java設(shè)計(jì)哲學(xué):沒有完善處理的代碼根本不會(huì)被執(zhí)行,體現(xiàn)了java的嚴(yán)謹(jǐn)性。


  對(duì)于構(gòu)造大型、健壯、可維護(hù)的應(yīng)用系統(tǒng)而言,錯(cuò)誤處理是整個(gè)應(yīng)用需要考慮的重要方面。Java異常處理機(jī)制,在程序運(yùn)行出現(xiàn)意外時(shí),系統(tǒng)會(huì)生成一個(gè)Exception對(duì)象,來通知程序,從而實(shí)現(xiàn)將“業(yè)務(wù)功能實(shí)現(xiàn)代碼”和“錯(cuò)誤處理代碼”分離,提供更好的可讀性。


  如果執(zhí)行try塊里的業(yè)務(wù)邏輯代碼時(shí)出現(xiàn)異常,系統(tǒng)會(huì)自動(dòng)生成一個(gè)異常對(duì)象,該異常對(duì)象被提交給運(yùn)行環(huán)境,這個(gè)過程被稱為拋出(throw)異常。Java環(huán)境收到異常對(duì)象時(shí),會(huì)尋找合適的catch塊,如果找不到,java運(yùn)行環(huán)境就會(huì)終止,java程序?qū)⑼顺觥?/p>


  不同的catch塊,視為了針對(duì)不同的異常類,提供不同的處理方法。


  對(duì)于錯(cuò)誤處理機(jī)制,主要有如下的兩個(gè)缺點(diǎn):


  1、無法窮舉所有異常情況:因?yàn)槿祟惖闹R(shí)是有限的,異常情況總比可以考慮到的情況多,總有漏網(wǎng)之魚。


  2、錯(cuò)誤處理代碼和業(yè)務(wù)實(shí)現(xiàn)代碼混雜嚴(yán)重影響程序的可讀性,會(huì)增加程序維護(hù)的難度。


  使用try...catch捕獲異常


  java提出了一種假設(shè),如果程序可以順利完成,那么一切正常,把系統(tǒng)的業(yè)務(wù)實(shí)現(xiàn)代碼放在try塊中定義,所有的異常處理邏輯放在catch塊中進(jìn)行處理。


  即:


     try{

  //業(yè)務(wù)實(shí)現(xiàn)代碼

  ...

  }

  catch(Exception e){

  輸入不合法

  }


  上面的格式中try塊和catch塊后的{...}都是不可以省略的!


  執(zhí)行步驟:


  1、如果執(zhí)行try塊中的業(yè)務(wù)邏輯代碼時(shí)出現(xiàn)異常,系統(tǒng)自動(dòng)生成一個(gè)異常對(duì)象,該異常對(duì)象被提交給java運(yùn)行環(huán)境,這個(gè)過程稱為拋出(throw)異常。


  2、當(dāng)java運(yùn)行環(huán)境收到異常對(duì)象時(shí),會(huì)尋找能處理該異常對(duì)象的catch塊,如果找到合適的cathc塊并把該異常對(duì)象交給catch塊處理,那這個(gè)過程稱為捕獲(catch)異常;如果java運(yùn)行時(shí)環(huán)境找不到捕獲異常的catch塊,則運(yùn)行時(shí)環(huán)境終止,jav程序也將退出。


  注意1:不管程序代碼塊是否處于try塊中,甚至包括catch塊中代碼,只要執(zhí)行該代碼時(shí)出現(xiàn)了異常,系統(tǒng)都會(huì)自動(dòng)生成一個(gè)異常對(duì)象,如果程序沒有為這段代碼定義任何catch塊,java運(yùn)行環(huán)境肯定找不到處理該異常的catch塊,程序肯定在此退出。


  注意2:try塊后可以有多個(gè)catch塊,try塊后使用多個(gè)catch塊是為了針對(duì)不同異常類提供的不同的異常處理方式。當(dāng)系統(tǒng)發(fā)生不同意外情況時(shí),系統(tǒng)會(huì)生成不同的異常對(duì)象,java運(yùn)行時(shí)就會(huì)根據(jù)該異常對(duì)象所屬的異常類來決定使用哪個(gè)catch塊來處理該異常。


  注意3:通常情況下,如果try塊被執(zhí)行一次,則try塊后只有一個(gè)catch塊會(huì)被執(zhí)行,絕不可能有多個(gè)catch塊被執(zhí)行,除非在循環(huán)中使用類continue開始下一次循環(huán),下一次循環(huán)又重新運(yùn)行了try塊,這才可能導(dǎo)致多個(gè)catch塊被執(zhí)行。


  注意4:進(jìn)行異常捕獲時(shí),一定要記住先捕獲小的異常,再捕獲大的異常。


Java的異常類,以及他們的繼承關(guān)系:


1.gif


  java把所有非正常情況分成兩種:異常(Exception)和錯(cuò)誤(Error),都是繼承自Throwable父類。


  Error錯(cuò)誤:一般是指虛擬機(jī)相關(guān)的問題,如系統(tǒng)崩潰,虛擬機(jī)出錯(cuò)誤等,這種錯(cuò)誤無法恢復(fù)或不可能捕獲,將導(dǎo)致應(yīng)用程序中斷,通常不處理。


  Throwable():Throwable 類是 Java 語言中所有錯(cuò)誤或異常的超類。只有當(dāng)對(duì)象是此類(或其子類之一)的實(shí)例時(shí),才能通過 Java 虛擬機(jī)或者 Java throw 語句拋出。類似地,只有此類或其子類之一才可以是 catch 子句中的參數(shù)類型。


  1、Error(錯(cuò)誤):一般是指java虛擬機(jī)相關(guān)的問題,如系統(tǒng)崩潰、虛擬機(jī)出錯(cuò)誤、動(dòng)態(tài)鏈接失敗等,這種錯(cuò)誤無法恢復(fù)或不可能捕獲,將導(dǎo)致應(yīng)用程序中斷,通常應(yīng)用程序無法處理這些錯(cuò)誤,因此應(yīng)用程序不應(yīng)該捕獲Error對(duì)象,也無須在其throws子句中聲明該方法拋出任何Error或其子類。


  2、Exception:Exception 類及其子類是 Throwable 的一種形式,它指出了合理的應(yīng)用程序想要捕獲的條件。


  (1)SQLException:該異常提供關(guān)于數(shù)據(jù)庫訪問錯(cuò)誤或其他錯(cuò)誤的信息。


  (2)RuntimeException 是那些可能在 Java 虛擬機(jī)正常運(yùn)行期間拋出的異常的超類。


  (3)IOException:此類為異常的通用類,它是由失敗的或中斷的 I/O 操作生成的。



  異常對(duì)象包含的常用方法:


  1、 getMessage();返回該異常的詳細(xì)描述字符


  2、printStackTrace():將該異常的跟蹤棧信息輸出到標(biāo)準(zhǔn)錯(cuò)誤輸出。


  3、 printStackTrace(PrintStream s):將該異常的跟蹤棧信息輸出到指定的輸出流


  4、getStackTrace():返回該異常的跟蹤棧信息。


  public class TestException

  {

 

  public static void main(String[] args)

  {

 

  try{

  FileInputStream fis=new FileInputStream("a.txt");

  }

   catch(IOException ioe)

  {

   System.out.println(ioe.getMessage());

  ioe.printStackTrace();

   }

  

   }

  

  }


  使用finally回收資源


  有時(shí)候,程序在try塊里面打開了一些物力資源(比如數(shù)據(jù)庫連接,網(wǎng)絡(luò)連接好磁盤文件等),這些物理資源都必須顯式回收。


  因?yàn)椋簀ava的垃圾回收機(jī)制不會(huì)回收任何的物理資源,垃圾回收機(jī)制只回收堆內(nèi)存中對(duì)象所占用的內(nèi)存。


  問題1:那么在哪邊回收這些物理資源呢?


在finally塊中,因?yàn)槿绻鹴ry塊的某條語句引起一場(chǎng),該語句后的其他語句通常不會(huì)被執(zhí)行,那將導(dǎo)致位于該語句后的資源回收語句得不到執(zhí)行;如果在catch塊里進(jìn)行資源回收,但catch塊完全有可能得不到執(zhí)行,這也將導(dǎo)致不能及時(shí)回收這些物理資源。所以我們不管try塊中的代碼是否出現(xiàn)異常,也不管哪個(gè)catch塊會(huì)被執(zhí)行,finally塊總會(huì)被執(zhí)行。


  那么:java異常處理的完整語法結(jié)構(gòu)如下:


try

{

     //業(yè)務(wù)實(shí)現(xiàn)邏輯

     ...

}

catch(SubException e)

{

     //異常處理快1

     ...

}

catch(SubException2 e)

{

     //異常處理快2

     ...

}

     ...

finally

{

    //資源回收塊

    ...

}


  以上的異常處理語法結(jié)構(gòu)中


  注意點(diǎn)1:只有try塊石必須的,也就是說如果沒有try塊,則不可能有后面的catch塊和finally塊;


  注意點(diǎn)2:catch塊和finally塊都是可選的,但catch塊和finally塊至少出現(xiàn)其中之一,也可以同時(shí)出現(xiàn);


  注意點(diǎn)3:可以有多個(gè)catch塊,捕獲父類異常的catch塊必須位于捕獲子類異常的后面;


  注意點(diǎn)4:不能只有try塊,既沒有catch塊,也沒有finally塊;


  注意點(diǎn)5:多個(gè)catch塊必須位于try塊之后,finally塊必須位于所有catch塊之后。


  import java.io.FileInputStream;

  import java.io.IOException;

  

  public class TestException

  {

  

      

     public static void main(String[] args)

     {

         // TODO Auto-generated method stub

         FileInputStream fis = null;

         try

         {

            fis = new FileInputStream("a.txt");

         } catch (IOException ioe)

         {

             System.out.println(ioe.getMessage());

            // return語句強(qiáng)制方法返回

             return;

             // 使用exit來退出虛擬機(jī)

             // System.exit(1);

         } finally

         {

             // 關(guān)閉磁盤文件,回收資源

             if (fis != null)

             {

                try

                {

                     fis.close();

                } catch (IOException ioe)

                 {

                     ioe.printStackTrace();

                 }

             }

            System.out.println("程序已經(jīng)執(zhí)行了finally里德資源回收");

         }

     }

 

 }


  運(yùn)行程序結(jié)果:


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


  程序已經(jīng)執(zhí)行了finally里德資源回收


  如果將catch塊中的最后兩句注釋放入程序,那么結(jié)果為:a.txt (系統(tǒng)找不到指定的文件。)


  以上兩種情況顯示:除非在try塊或者catch塊中調(diào)用了退出虛擬機(jī)的方法(即System.exit(1);),否則不管在try塊、catch塊中執(zhí)行怎樣的代碼,出現(xiàn)怎樣的情況,異常處理的finally塊總是會(huì)被執(zhí)行的。不過,一般情況下,不要再finally塊中使用renturn或throw等導(dǎo)致方法終止的語句,因?yàn)橐坏┦褂茫瑢?huì)導(dǎo)致try塊、catch塊中的return、throw語句失效。


public class TestException1

 {

 

      public static boolean test()

      {

          try

          {

              return true;

          } finally

         {

             return false;

         }

     }

 

     public static void main(String[] args)

     {

         boolean a = test();

         System.out.println(a);

     }


 }

  


運(yùn)行結(jié)果:false


  以上的小程序說明:在finally塊中定義了一個(gè)renturn false語句,這將導(dǎo)致try塊中的return true 失去作用!


  總結(jié)一下這個(gè)小問題:


  當(dāng)程序執(zhí)行try塊,catch塊時(shí)遇到return語句或者throw語句,這兩個(gè)語句都會(huì)導(dǎo)致該方法立即結(jié)束,所以系統(tǒng)并不會(huì)立即執(zhí)行這兩個(gè)語句,而是去尋找該異常處理流程中的finally塊,如果沒有finally塊,程序立即執(zhí)行return語句或者throw語句,方法終止。如果有finally塊,系統(tǒng)立即開始執(zhí)行finally塊,只有當(dāng)finally塊執(zhí)行完成后,系統(tǒng)才會(huì)再次跳回來執(zhí)行try塊、catch塊里的return或throw語句,如果finally塊里也使用了return或throw等導(dǎo)致方法終止的語句,則finally塊已經(jīng)終止了方法,不用再跳回去執(zhí)行try塊、catch塊里的任何代碼了。


  綜上:盡量避免在finally塊里使用return或throw等導(dǎo)致方法終止的語句,否則可能出現(xiàn)一些很奇怪的情況!


  異常處理的嵌套


  例如catch塊中再次包含了一個(gè)完整的異常處理流程,這種在try塊,catch塊或finally塊中包含完整的異常處理流程的情形稱為異常處理的嵌套。異常處理流程的代碼可以放在任何可執(zhí)行代碼的地方,因此完整的異常處理流程既可放在try塊,也可放在catch塊,也可放在finally塊里。


  嵌套的深度沒有很明確的限制,通常沒有必要寫層次太深的嵌套異常處理,會(huì)導(dǎo)致程序可讀性降低。


由于java異常處理機(jī)制詳解的內(nèi)容太多,本文已滿,請(qǐng)看下文:http://m.ilovecolors.com.cn/javazixun/1655.html



提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 国产大片免费看 | 麻豆va在线精品免费播放 | 99视频在线看| a黄色一级 | 国产精品麻豆综合在线 | 国产综合在线播放 | 韩国理伦片在线理伦韩国 | 美女视频永久黄网站在线观看 | 香蕉亚洲欧洲在线一区 | 国产成人a毛片在线 | 国产三级成人 | 最近中文字幕完整视频高清10 | 午夜刺激视频 | 91欧美秘密入口 | 成年黄网站色大免费全看 | 欧美一级黄色录相 | 另类欧美日韩 | 久久精品视频一区二区三区 | 男女猛烈无遮挡性视频 | 国产精品视频一区二区三区经 | 日韩日韩精品无砖专区2020 | 亚洲欧美日韩精品久久亚洲区色播 | 欧美视频免费一区二区三区 | 带色视频| 国产一级久久久久久毛片 | 国产精品一区二区不卡 | 亚洲日日做天天做日日谢 | 一级a毛片免费观看久久精品 | 狂野欧美性猛交xxxx | 久久本道综合色狠狠五月 | 在线日韩欧美一区二区三区 | 亚洲人成片在线观看 | 操片免费看 | 艾草在线精品视频播放 | 国产美女丝袜黑色视频 | 伦理片在线观看网站资源 | 国内一级一级毛片a免费 | 国产不卡高清 | 9i9精品国产免费久久 | 国产精品二区页在线播放 | 日本簧片 |