亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

深入理解java異常處理機(jī)制的原理和開發(fā)應(yīng)用

 更新時(shí)間:2017年04月11日 16:49:22   作者:zju_jzb  
 Java異常處理機(jī)制在日常開發(fā)中應(yīng)用頻繁,本篇文章主要在基礎(chǔ)的使用方法上,更進(jìn)一步的,如何更加合理的使用異常機(jī)制,希望可以對(duì)各位朋友能有所幫助。

  Java異常處理機(jī)制其最主要的幾個(gè)關(guān)鍵字:try、catch、finally、throw、throws,以及各種各樣的Exception。本篇文章主要在基礎(chǔ)的使用方法上,介紹了如何更加合理的使用異常機(jī)制。 

try-catch-finally

    try-catch-finally塊的用法比較簡(jiǎn)單,使用頻次也最高。try塊中包含可能出現(xiàn)異常的語(yǔ)句(當(dāng)然這是人為決定的,try理論上可以包含任何代碼),catch塊負(fù)責(zé)捕獲可能出現(xiàn)的異常,finally負(fù)責(zé)執(zhí)行必須執(zhí)行的語(yǔ)句,這里的代碼不論是否發(fā)生了異常,都會(huì)被執(zhí)行。

    針對(duì)這部分,因?yàn)楹芑A(chǔ),所以就提幾點(diǎn)比較關(guān)鍵的建議:

      1、當(dāng)你在寫try-catch語(yǔ)句的時(shí)候,腦子里是知道自己要去針對(duì)哪種異常進(jìn)行處理的,不要只是以防萬一,加了個(gè)catch(Exception e),這是毫無意義的。并且,一個(gè)try塊中可能有多個(gè)異常,對(duì)于每一類異常,要分別寫一個(gè)catch進(jìn)行捕獲。       

      2、針對(duì)可能出現(xiàn)異常的語(yǔ)句進(jìn)行try-catch,大段代碼的try-catch會(huì)非常不利于維護(hù)代碼時(shí)定位異??赡馨l(fā)生的位置,對(duì)于肯定不會(huì)發(fā)生異常的穩(wěn)定的代碼,不需要放在try塊中。

      3、try-catch雖然在功能上,可以成為流程控制的工具,達(dá)到條件分支的效果。但相比于if-else語(yǔ)句,java的異常處理機(jī)制基于面向?qū)ο蟮乃枷?,使用過程中需要更多的時(shí)間與空間的開銷,所以不要用異常機(jī)制去做基本的條件判斷,只有在程序會(huì)因?yàn)楫惓6袛鄷r(shí)進(jìn)行捕獲和處理。

      4、finally塊中永遠(yuǎn)不要寫return語(yǔ)句,因?yàn)閒inally塊中總是最后執(zhí)行,他會(huì)改變預(yù)期在trycatch塊中的返回值(舉個(gè)例子,你在catch中捕獲了一個(gè)異常并拋出e,又在finally語(yǔ)句中return true,這樣你拋出的異常就"消失"了,因?yàn)楫?dāng)前函數(shù)的執(zhí)行結(jié)果已經(jīng)從拋出異常 轉(zhuǎn)變成 return true)。另外,在使用資源對(duì)象與流對(duì)象時(shí),finally塊必須對(duì)資源對(duì)象、流對(duì)象進(jìn)行關(guān)閉。

Java異常體系結(jié)構(gòu)

    Java異常體系的基類是Throwable,它主要有兩個(gè)子類:Error Exception。其結(jié)構(gòu)如下圖:

      

    上圖中,Error是指程序無法處理的錯(cuò)誤,多指系統(tǒng)內(nèi)部比較嚴(yán)重的錯(cuò)誤。大多數(shù)這類錯(cuò)誤與開發(fā)人員無關(guān),我們關(guān)注的主要是Exception。

    Exception主要分為兩塊:運(yùn)行時(shí)異常非運(yùn)行時(shí)異常。RuntimeException及其子類都稱為運(yùn)行時(shí)異常;除此之外, 所有Exception的子類異常都是非運(yùn)行時(shí)異常。

    運(yùn)行時(shí)異常多指程序邏輯上出現(xiàn)問題(也就是我們自己寫代碼邏輯出了問題),常見的錯(cuò)誤包括 ClassCastException:類型轉(zhuǎn)換異常、NullPointerException:空指針異常、IndexOutOfBoundsException:越界異常...這些異常都可以通過程序邏輯處理來避免(比如加一個(gè)判斷語(yǔ)句判斷是否越界、是否屬于某類型、是否為null),所以編譯器把這些工作交給了程序員來把控,在編譯期即使手動(dòng)拋出了一個(gè)運(yùn)行時(shí)異常不去捕獲,編譯器也會(huì)通過。因而這類異常也叫做"未檢查異常"(uncheck)。同樣屬于未檢查異常的還有所有的Error。即上圖中,所有藍(lán)色框表示未檢查異常,橙色框表示"檢查異常"(check)。對(duì)于檢查異常,在可能發(fā)生異常的位置需要用try-catch塊去捕獲并處理,如果不處理它,就會(huì)一直向上層調(diào)用拋出,直到被處理為止。

throw 與 throws

    throws關(guān)鍵字主要在方法簽名中使用,用于聲明該方法可能拋出的異常。throws 可以理解成是一種通知行為,沒有實(shí)際的拋出異常的動(dòng)作,而僅僅是告訴調(diào)用他的上層函數(shù),這里可能會(huì)拋出這個(gè)異常;

    throw用于在函數(shù)體內(nèi)語(yǔ)句中,表示拋出一個(gè)實(shí)際的異常的實(shí)際動(dòng)作,如果在函數(shù)內(nèi)沒有捕獲并處理,那么將會(huì)一直向上拋出這個(gè)異常直到被main()/Thread.run()拋出。

    當(dāng)一個(gè)函數(shù)throws聲明函數(shù)可能拋出一個(gè)非運(yùn)行時(shí)異常(檢查異常)時(shí),那么即使這個(gè)函數(shù)內(nèi)部不顯示使用throw,調(diào)用它的上層函數(shù)也必須包含處理這個(gè)異常的代碼。舉個(gè)例子:

public class Main {

    public static void main(String[] args){

        exceptionTest();
    }
    static int exceptionTest() throws IOException {
       
        return 0;   
    }
}   

上述代碼中調(diào)用的exceptionTest函數(shù)聲明拋出一個(gè)IOException屬于檢查異常,哪怕exceptionTest函數(shù)中不可能拋出這個(gè)異常,調(diào)用它的函數(shù)也必須對(duì)此異常做出捕獲處理。現(xiàn)在main函數(shù)中沒有相關(guān)的處理邏輯,所以會(huì)編譯錯(cuò)誤,如下圖:

    而對(duì)運(yùn)行時(shí)異常,就是另一種情況了:

public class Main {
 
 public static void main(String[] args){
 
 int i = divideTest(0);
 System.out.println(i);
 }
 static int divideTest(int b) throws ArithmeticException { 
 
 int i = 5/b;
 return i; 
 }
 }

    同樣在main函數(shù)沒有處理異常的邏輯,這次聲明拋出的異常是ArithmeicException,他屬于運(yùn)行時(shí)異常(RuntimeException),所以編譯器對(duì)聲明的拋出置之不理:

 

  

  雖然編譯期通過,但在運(yùn)行時(shí)程序仍然會(huì)自動(dòng)拋出運(yùn)行時(shí)異常,并一直向上拋出到Main函數(shù)。而Main()中沒有對(duì)該異常的捕獲處理,所以主線程終止。

    結(jié)論:我目前的理解是,throws一個(gè)運(yùn)行時(shí)異常是沒有任何實(shí)際意義的,除非你為了遵循某個(gè)統(tǒng)一的規(guī)范而這樣做。throws 存在的意義主要是將可能的非運(yùn)行時(shí)異常交給編譯器把關(guān),讓編譯器監(jiān)督開發(fā)人員對(duì)這些異常進(jìn)行捕獲處理。

    另外,當(dāng)你需要自定義一個(gè)異常時(shí),如果需要在編譯期檢查,并在上層統(tǒng)一處理,那么直接繼承Exception成為一個(gè)檢查異常;如果不需要編譯期檢查,拋出異常表示程序異常需要直接中斷,那么繼承RuntimeException成為一個(gè)運(yùn)行時(shí)異常即可。

              希望本篇文章可以對(duì)各位朋友有所幫助!

相關(guān)文章

  • Java線程池中的各個(gè)參數(shù)如何合理設(shè)置

    Java線程池中的各個(gè)參數(shù)如何合理設(shè)置

    這篇文章主要介紹了Java線程池中的各個(gè)參數(shù)如何合理設(shè)置操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java super和this的對(duì)比及使用

    Java super和this的對(duì)比及使用

    這篇文章主要介紹了Java super和this的對(duì)比及使用的相關(guān)資料,java中this與super會(huì)經(jīng)常在使用的時(shí)候混淆,需要的朋友可以參考下
    2017-08-08
  • RestTemplate實(shí)現(xiàn)發(fā)送帶headers的GET請(qǐng)求

    RestTemplate實(shí)現(xiàn)發(fā)送帶headers的GET請(qǐng)求

    這篇文章主要介紹了RestTemplate實(shí)現(xiàn)發(fā)送帶headers的GET請(qǐng)求,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java設(shè)計(jì)模式之責(zé)任鏈模式

    Java設(shè)計(jì)模式之責(zé)任鏈模式

    今天小編就為大家分享一篇關(guān)于Java設(shè)計(jì)模式之責(zé)任鏈模式,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • 解決mybatis批量更新(update foreach)失敗的問題

    解決mybatis批量更新(update foreach)失敗的問題

    這篇文章主要介紹了解決mybatis批量更新(update foreach)失敗的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • Java四種常用線程池的詳細(xì)介紹

    Java四種常用線程池的詳細(xì)介紹

    今天小編就為大家分享一篇關(guān)于Java四種常用線程池的詳細(xì)介紹,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • 使用java從亂碼文本中解析出正確的文本

    使用java從亂碼文本中解析出正確的文本

    這篇文章主要介紹了使用java從亂碼文本中解析出正確的文本的方法,需要的朋友可以參考下
    2014-04-04
  • Maven中利用assembly插件打包jar包

    Maven中利用assembly插件打包jar包

    本文詳細(xì)講解了Maven中利用assembly插件打包jar包的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • 使用1招搞定maven打包空間不足的問題

    使用1招搞定maven打包空間不足的問題

    這篇文章主要介紹了使用1招搞定maven打包空間不足的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • 基于ssm中dao接口@Param注解的用法

    基于ssm中dao接口@Param注解的用法

    這篇文章主要介紹了基于ssm中dao接口@Param注解的用法,具有很好的參考價(jià)值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02

最新評(píng)論