固然,你須要明白異常在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,不符合要求");
}
}
}