全國(guó)咨詢(xún)/投訴熱線(xiàn):400-618-4000

首頁(yè)技術(shù)文章正文

Java程序異常處理之try…catch和finally[黑馬程序員]

更新時(shí)間:2019-09-17 來(lái)源:黑馬程序員 瀏覽量:

在java程序運(yùn)行中,如果發(fā)成異常,程序立即終止,無(wú)法繼續(xù)向下執(zhí)行。為了解決這樣的問(wèn)題,Java中提供了一種對(duì)異常進(jìn)行處理的方式——異常捕獲。異常捕獲通常使用try…catch語(yǔ)句,具體語(yǔ)法格式如下:

try{

    //程序代碼塊

} catch(ExceptionType (Exception 類(lèi)及其子類(lèi)) e) {

    //對(duì) ExceptionType的處理

}

 

  

1575881083091_java-異常-處理.jpg


其中在try代碼塊中編寫(xiě)可能發(fā)生異常的Java語(yǔ)句,catch代碼塊中編寫(xiě)針對(duì)異常進(jìn)行處理的代碼。當(dāng)try代碼塊中的程序發(fā)生了異常,系統(tǒng)會(huì)將這個(gè)異常的信息封裝成一個(gè)異常對(duì)象,并將這個(gè)對(duì)象傳遞給catch代碼塊。catch代碼塊需要一個(gè)參數(shù)指明它所能夠接收的異常類(lèi)型,這個(gè)參數(shù)的類(lèi)型必須是 Exception類(lèi)或其子類(lèi)。

public class Example{

    public static void main(String [] args){

            //下面的代碼定義了一個(gè) try catch語(yǔ)句用于捕獲異常

            try{

                int result= divide(4,0);    //調(diào)用 divide()方法

                System.out.println(result);

            } catch (Exception e) {     //對(duì)異常進(jìn)行處理

          System.out.println("捕獲的異常信息為:"+e.getMessage());

            }

            System.out.printIn("程序繼續(xù)向下執(zhí)行……”);

        }

      //下面的方法實(shí)現(xiàn)了兩個(gè)整數(shù)相除

    public static divide (int x,int y) {

        int result=X / y;    //定義一個(gè)變量result記錄兩個(gè)數(shù)相乘的結(jié)果

        return result;      //將結(jié)果返回

    }

}


 

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

D:\cn\itcast\chapter04>java Example
捕獲的異常信息為:/ by zero
程序繼續(xù)向下執(zhí)行…

 

上面案例中,對(duì)可能發(fā)生異常的代碼用try…catch語(yǔ)句進(jìn)行了處理。在try代碼塊中發(fā)生被0除異常,程序會(huì)轉(zhuǎn)而執(zhí)行catch中的代碼,通過(guò)調(diào)用Exception對(duì)象的getMessage()方法,返回異常信息“/by zero”。catch代碼塊對(duì)異常處理完畢后,程序仍會(huì)向下執(zhí)行,而不會(huì)異常終止。


需要注意的是,在try代碼塊中,發(fā)生異常語(yǔ)句后面的代碼是不會(huì)被執(zhí)行的,如本例中第6行代碼的打印語(yǔ)句就沒(méi)有執(zhí)行。

在程序中,有時(shí)候我們希望有些語(yǔ)句無(wú)論程序是否發(fā)生異常都要執(zhí)行,這時(shí)就可以在try…catch語(yǔ)句后,加一個(gè)finally代碼塊,接下來(lái)對(duì)演示一下finally代碼塊的用法。

public class Example{

    public static void main (String[] args) {

       //下面的代碼定義了一個(gè)try… catch…fina1ly語(yǔ)句用于獲異常

       try {

          int result= divide(4,0);  //調(diào)用 divide()方法

          System.out.println(result);

       } catch (Exception e){        //對(duì)捕獲到的異常進(jìn)行處理

        System.out.println(“捕獲的異常信息為:”+e.getMessage());

        return;     //用于結(jié)束當(dāng)前語(yǔ)句

       } finally {

        System.out.println("進(jìn)人finally代碼塊”);

          }

      System.out.println("程序繼續(xù)向下執(zhí)行……”);

    }

      //下面的方法實(shí)現(xiàn)了兩個(gè)整數(shù)相除

    public static int divide (int x, int y){

       int result=x / y; //定義一個(gè)變量result記錄兩個(gè)數(shù)相除的結(jié)果

       return result;   //將結(jié)果返回

    }

}

 

運(yùn)行結(jié)果為:
D:\cn\itcast\chapter04>java Example
捕獲的異常信息為:/ by zero
進(jìn)入finally代碼塊

 
在上面例子中catch代碼塊中增加了一個(gè)return語(yǔ)句,用于結(jié)束當(dāng)前方法,此時(shí)程序第13行代碼就不會(huì)執(zhí)行了,而 finally中的代碼仍會(huì)執(zhí)行,并不會(huì)被 return語(yǔ)句所影響,也就是說(shuō)不論程序是發(fā)生異常還是使用 retur語(yǔ)句結(jié)束, finally中的語(yǔ)句都會(huì)執(zhí)行,正是由于這種特殊性,在程序設(shè)計(jì)時(shí),經(jīng)常會(huì)在try… catch后使用 finally代碼塊來(lái)完成必須做的事情,例如釋放系統(tǒng)資源。

需要注意的是,finally中的代碼塊有一種情況下是不會(huì)執(zhí)行的,那就是在try…catch中執(zhí)行了 System.exit(0)語(yǔ)句。System.exit(0)表示退出當(dāng)前的Java虛擬機(jī),Java虛擬機(jī)停止了,任何代碼都不能再執(zhí)行了。

以上我們介紹了,java異常處理的方法try…catch和finally 希望對(duì)您有所幫助,如果想系統(tǒng)學(xué)習(xí)java,請(qǐng)點(diǎn)擊頁(yè)面咨詢(xún)按鈕,了解黑馬程序員java培訓(xùn)課程詳情。

分享到:
在線(xiàn)咨詢(xún) 我要報(bào)名
和我們?cè)诰€(xiàn)交談!