Java中throws和throw的區別講解

1、throws關鍵字通常被應用在聲明方法時,用來指定可能拋出的異常。多個異常可以使用逗號隔開。當在主函數中調用該方法時,如果發生異常,就會將異常拋給指定異常對象。如下面例子所示:
public class Shoot {   創建類
static void pop() throws NegativeArraySizeException {
//定義方法並拋出NegativeArraySizeException異常
int [] arr = new int[-3];//創建數組
}
public static void main(String[] args) {//主方法
try { 
pop(); //調用pop()方法
} catch (NegativeArraySizeException e) {
System.out.println("pop()方法拋出的異常");//輸出異常信息
}
}
}

2、throw關鍵字通常用在方法體中,並且拋出一個異常對象。程序在執行到throw語句時立即停止,它後面的語句都不執行。通過throw拋出異常後,如果想在上一級代碼中來捕獲並處理異常,則需要在拋出異常的方法中使用throws關鍵字在方法聲明中指明要跑出的異常;如果要捕捉throw拋出的異常,則必須使用try—catch語句。舉例如下:
class MyException extends Exception { //創建自定義異常類
 String message; //定義String類型變量
 public MyException(String ErrorMessagr) {  //父類方法
       message = ErrorMessagr;
 }
 public String getMessage(){   //覆蓋getMessage()方法
  return message;
 }
}
public class Captor { //創建類
static int quotient(int x,int y) throws MyException{//定義方法拋出異常
if(y < 0){  //判斷參數是否小於0
         throw new MyException("除數不能是負數");//異常信息
 }
 return x/y;//返回值
 }
public static void main(String args[]){ //主方法
 try{ //try語句包含可能發生異常的語句
                int result = quotient(3,-1);//調用方法quotient()
    }catch (MyException e) { //處理自定義異常
  System.out.println(e.getMessage()); //輸出異常信息
  }
    catch (ArithmeticException e) {
                   //處理ArithmeticException異常
  System.out.println("除數不能爲0");//輸出提示信息
  }
   catch (Exception e) { //處理其他異常
  System.out.println("程序發生了其他的異常");
                  //輸出提示信息
  }
 }
}


當然,你需要明白異常在Java中式以一個對象來看待。
並且所有系統定義的編譯和運行異常都可以由系統自動拋出,稱爲標準異常,但是一般情況下Java 強烈地要求應用程序進行完整的異常處理,給用戶友好的提示,或者修正後使程序繼續執行。
直接進入正題哈:
1.用戶程序自定義的異常和應用程序特定的異常,必須藉助於 throws 和 throw 語句來定義拋出異常。

1.1   throw是語句拋出一個異常。
語法:throw (異常對象);
         throw e;

1.2   throws是方法可能拋出異常的聲明。(用在聲明方法時,表示該方法可能要拋出異常)
語法:[(修飾符)](返回值類型)(方法名)([參數列表])[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的話,那就是你把那個傾向變成真實的了。

同時:
1、throws出現在方法函數頭;而throw出現在函數體。
2、throws表示出現異常的一種可能性,並不一定會發生這些異常;throw則是拋出了異常,執行throw則一定拋出了某種異常。
3、兩者都是消極處理異常的方式(這裏的消極並不是說這種方式不好),只是拋出或者可能拋出異常,但是不會由函數去處理異常,真正的處理異常由函數的上層調用處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章