Java中throws和throw的區別講解

固然,你須要明白異常在Java中式以一個對象來看待。程序員

而且全部系統定義的編譯和運行異常均可以由系統自動拋出,稱爲標準異常,可是通常狀況下Java 強烈地要求應用程序進行完整的異常處理,給用戶友好的提示,或者修正後使程序繼續執行。函數

直接進入正題哈:對象

1.用戶程序自定義的異常和應用程序特定的異常,必須藉助於 throws 和 throw 語句來定義拋出異常。ip

 

1.1   throw是語句拋出一個異常。get

語法:throw (異常對象);io

         throw e;編譯

 

1.2   throws是方法可能拋出異常的聲明。(用在聲明方法時,表示該方法可能要拋出異常)class

語法:[(修飾符)](返回值類型)(方法名)([參數列表])[throws(異常類)]{......}語法

            public void doA(int a) throws Exception1,Exception3{......}程序

 

舉例:

 

throws E1,E2,E3只是告訴程序這個方法可能會拋出這些異常,方法的調用者可能要處理這些異常,而這些異常E1,E2,E3多是該函數體產生的。

throw則是明確了這個地方要拋出這個異常。

 

如: void doA(int a) throws IOException,{

           try{

                 ......

 

           }catch(Exception1 e){

              throw e;

           }catch(Exception2 e){

              System.out.println("出錯了!");

           }

           if(a!=b)

              throw new  Exception3("自定義異常");

}

 

代碼塊中可能會產生3個異常,(Exception1,Exception2,Exception3)。

若是產生Exception1異常,則捕獲以後再拋出,由該方法的調用者去處理。

若是產生Exception2異常,則該方法本身處理了(即System.out.println("出錯了!");)。因此該方法就不會再向外拋出Exception2異常了,void doA() throws Exception1,Exception3 裏面的Exception2也就不用寫了。

而Exception3異常是該方法的某段邏輯出錯,程序員本身作了處理,在該段邏輯錯誤的狀況下拋出異常Exception3,則該方法的調用者也要處理此異常。

 

throw語句用在方法體內,表示拋出異常,由方法體內的語句處理。

throws語句用在方法聲明後面,表示再拋出異常,由該方法的調用者來處理。

 

throws主要是聲明這個方法會拋出這種類型的異常,使它的調用者知道要捕獲這個異常。

throw是具體向外拋異常的動做,因此它是拋出一個異常實例。

 

throws說明你有那個可能,傾向。

throw的話,那就是你把那個傾向變成真實的了。

 

同時:

一、throws出如今方法函數頭;而throw出如今函數體。

二、throws表示出現異常的一種可能性,並不必定會發生這些異常;throw則是拋出了異常,執行throw則必定拋出了某種異常。

三、二者都是消極處理異常的方式(這裏的消極並非說這種方式很差),只是拋出或者可能拋出異常,可是不會由函數去處理異常,真正的處理異常由函數的上層調用處理。

 

 

 

throws和throw

 

throws:用來聲明一個方法可能產生的全部異常,不作任何處理而是將異常往上傳,誰調用我我就拋給誰。

  用在方法聲明後面,跟的是異常類名

  能夠跟多個異常類名,用逗號隔開

  表示拋出異常,由該方法的調用者來處理

  throws表示出現異常的一種可能性,並不必定會發生這些異常

throw:則是用來拋出一個具體的異常類型。

  用在方法體內,跟的是異常對象名

  只能拋出一個異常對象名

  表示拋出異常,由方法體內的語句處理

  throw則是拋出了異常,執行throw則必定拋出了某種異常  

分別介紹

 

throws在方法後邊聲明異常,其實就是本身不想對異常作出任何的處理,告訴別人本身可能出現的異常,交給別人處理,然別人處理

 

package com.xinkaipu.Exception;

class Math{

    public int div(int i,int j) throws Exception{

        int t=i/j;

        return t;

    }

}

 

 

public class ThrowsDemo {

    public static void main(String args[]) throws Exception{

        Math m=new Math();

   }

}

throw:就是本身處理一個異常,有兩種方式要麼是本身捕獲異常try...catch代碼塊,要麼是拋出一個異常(throws 異常)

 

package com.xinkaipu.Exception;

 

public class TestThrow

{

    public static void main(String[] args) 

    {

        try

        {

            //調用帶throws聲明的方法,必須顯式捕獲該異常

            //不然,必須在main方法中再次聲明拋出

            throwChecked(-3);            

        }

        catch (Exception e)

        {

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

        }

        //調用拋出Runtime異常的方法既能夠顯式捕獲該異常,

        //也可不理會該異常

        throwRuntime(3);

    }

    public static void throwChecked(int a)throws Exception

    {

        if (a > 0)

        {

            //自行拋出Exception異常

            //該代碼必須處於try塊裏,或處於帶throws聲明的方法中

            throw new Exception("a的值大於0,不符合要求");

        }

    }

    public static void throwRuntime(int a)

    {

        if (a > 0)

        {

            //自行拋出RuntimeException異常,既能夠顯式捕獲該異常

            //也可徹底不理會該異常,把該異常交給該方法調用者處理

            throw new RuntimeException("a的值大於0,不符合要求");

        }

    }

}

相關文章
相關標籤/搜索