2019-04-29異常throw和try catch和finally的對(duì)比

java里的異常多種多樣荐开,這是一種非常有用的機(jī)制咧最,它能幫助我們處理那些我們未知的錯(cuò)誤赠堵,在java里,關(guān)于異常的有throw throws,還有一個(gè)try catch 程序塊礼饱。接下來(lái)我們挨個(gè)看看這幾個(gè)的作用。

1.throw
throw 就是拋出一個(gè)異常,并獲取這個(gè)異常的引用回俐,這個(gè)異常會(huì)被拋到外部的環(huán)境,由外部環(huán)境進(jìn)行處理

class A{
    public void func() throws Exception{
        throw new Exception();
    }
}
這里拋出了一個(gè)Exception,Exception是throwable的子類稀并,是所有異常的基類仅颇。與此同時(shí),throwable還有另一個(gè)子類,也就是Error碘举。

這里會(huì)把Exception這個(gè)引用拋到外部環(huán)境中去處理忘瓦。

throw跟try...catch...finally的對(duì)比:

 

public class  ZeroTest {
    public static  void  main(String[] args) {
     try{
       int i = 100/ 0;
       System.out.print(i);
  }catch(Exception e){
       System.out.print(1);
       throw new  RuntimeException();
  }finally{
       System.out.print(2);
  }
      System.out.print(3);
  }
}
 
  try catch是直接處理,處理完成之后程序繼續(xù)往下執(zhí)行引颈,throw則是將異常拋給它的上一級(jí)處理耕皮,程序便不往下執(zhí)行了。
本題的catch語(yǔ)句塊里面蝙场,打印完1之后凌停,又拋出了一個(gè)RuntimeException,程序并沒(méi)有處理它李丰,而是直接拋出苦锨,
 因此執(zhí)行完finally語(yǔ)句塊之后,程序終止了
 
   首先執(zhí)行try,遇到算術(shù)異常舟舒,拋出拉庶,執(zhí)行catch,打印1秃励,然后拋出RuntimeException氏仗,緩存異常,執(zhí)行finally夺鲜,打印2皆尔,然后拋出RuntimeException。
  如果catch中沒(méi)有拋出RuntimeException币励,則執(zhí)行結(jié)果為123慷蠕。
 

2.throws
那我們就不得不說(shuō)一下throws,其實(shí)throws并不是拋出一個(gè)實(shí)際的Exception而是一個(gè)異常聲明食呻,它聲明這個(gè)方法可能會(huì)拋出一個(gè)異常流炕,注意是可能,所以在沒(méi)有異常的情況下也是可以用throws的仅胞,而throws本身的作用也是用來(lái)提高程序的健壯性每辟,反過(guò)來(lái),如果這個(gè)方法的的確確的有一個(gè)異常干旧,那么編譯器會(huì)強(qiáng)制讓你加上throws這個(gè)異常聲明渠欺。

通常throws是寫在參數(shù)列表的后面,這樣就表明這個(gè)方法有可能會(huì)拋出一個(gè)異常

class A{
    public void func() throws Exception{
        throw new Exception();
    }
    
    public void g() throws Exception{
        
    }
}
3.try...catch
當(dāng)我們?cè)谄洵h(huán)境中調(diào)用func 和 g的時(shí)候椎眯,編譯器會(huì)通知我們需要用一個(gè)Try catch程序塊來(lái)處理這個(gè)異常挠将。

這個(gè)程序塊分兩塊,第一塊是try{} ,第二塊是catch(exception的引用){}
try這個(gè)程序塊很有意思盅视,因?yàn)樗拿趾芤锥杳褪菄L試,嘗試能不能正常的走完整個(gè)作用域闹击,如果不能則拋出一個(gè)異常镶蹋。所以我們?cè)趖ry塊里經(jīng)常放上可能會(huì)拋出異常的程序段。
而catch恰好就是處理try里拋出來(lái)的異常赏半,其中catch的參數(shù)列表接收的是一個(gè)異常的引用贺归,是throw拋出來(lái)的異常的引用,這樣我們就可以得到這個(gè)異常的對(duì)象断箫,倒不如說(shuō)我們是得到來(lái)了這個(gè)異常對(duì)象的引用拂酣,因?yàn)樵趈ava里,通常我們也只能通過(guò)引用來(lái)操縱對(duì)象仲义。

PS:當(dāng) throw new RuntimeException的時(shí)候婶熬,不用throws

public class Main {
    public static void main(String[] args){
        A a = new A();
        try{
            a.func();
            a.g();
        }
        catch(Exception e){
            System.out.println("捕獲了一個(gè)異常");
        }
    }
}
我們捕獲了func 的異常剑勾,因?yàn)槲覀兠鞔_的指明func 會(huì)拋出一個(gè)異常throw new Exception();所以我們這里也會(huì)捕獲到,并去處理它赵颅,所以運(yùn)行起來(lái)我們會(huì)看到控制臺(tái)上會(huì)打印“捕獲了一個(gè)異乘淞恚”。

盡管g()沒(méi)有拋出任何的異常饺谬,編譯器還是要求我們要用try catch把它括起來(lái)捂刺,是因?yàn)樗鼡碛幸粋€(gè)throws 異常說(shuō)明。


 

**下面是常見(jiàn)的幾種異常募寨,供大家參考:

輸入輸出異常:IOException
算術(shù)異常類:ArithmeticExecption
空指針異常類:NullPointerException
類型強(qiáng)制轉(zhuǎn)換異常:ClassCastException

操作數(shù)據(jù)庫(kù)異常:SQLException

文件未找到異常:FileNotFoundException
數(shù)組負(fù)下標(biāo)異常:NegativeArrayException
數(shù)組下標(biāo)越界異常:ArrayIndexOutOfBoundsException
違背安全原則異常:SecturityException
文件已結(jié)束異常:EOFException
字符串轉(zhuǎn)換為數(shù)字異常:NumberFormatException
方法未找到異常:NoSuchMethodException
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末族展,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子拔鹰,更是在濱河造成了極大的恐慌仪缸,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件格郁,死亡現(xiàn)場(chǎng)離奇詭異腹殿,居然都是意外死亡独悴,警方通過(guò)查閱死者的電腦和手機(jī)例书,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)刻炒,“玉大人决采,你說(shuō)我怎么就攤上這事》匕拢” “怎么了树瞭?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)爱谁。 經(jīng)常有香客問(wèn)我晒喷,道長(zhǎng),這世上最難降的妖魔是什么访敌? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任凉敲,我火速辦了婚禮,結(jié)果婚禮上寺旺,老公的妹妹穿的比我還像新娘爷抓。我一直安慰自己,他們只是感情好阻塑,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布蓝撇。 她就那樣靜靜地躺著,像睡著了一般陈莽。 火紅的嫁衣襯著肌膚如雪渤昌。 梳的紋絲不亂的頭發(fā)上虽抄,一...
    開(kāi)封第一講書(shū)人閱讀 49,792評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音独柑,去河邊找鬼极颓。 笑死,一個(gè)胖子當(dāng)著我的面吹牛群嗤,可吹牛的內(nèi)容都是我干的菠隆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼狂秘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼骇径!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起者春,我...
    開(kāi)封第一講書(shū)人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤破衔,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后钱烟,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體晰筛,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年拴袭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了读第。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拥刻,死狀恐怖怜瞒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情般哼,我是刑警寧澤吴汪,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站蒸眠,受9級(jí)特大地震影響漾橙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜楞卡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一霜运、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧臀晃,春花似錦觉渴、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至险绘,卻和暖如春踢京,著一層夾襖步出監(jiān)牢的瞬間誉碴,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工瓣距, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留黔帕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓蹈丸,卻偏偏與公主長(zhǎng)得像成黄,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子逻杖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容