throw跟throws關鍵字


throws關鍵字

定義一個方法的時候可以使用throws關鍵字聲明。使用throws關鍵字聲明的方法表示此方法不處理異常,而交給方法調用處進行處理

throws關鍵字格式:

public 返回值類型 方法名稱(參數列表,,,)throws 異常類{};

 假設定義一個除法,對於除法操作可能出現異常,可能不會。所以對於這種方法最好將它使用throws關鍵字聲明,一旦出現異常,

則應該交給調用處處理。

class Math{
    public int div(int i,int j) throws Exception{    // 定義除法操作,如果有異常,則交給被調用處處理
        int temp = i / j ;    // 計算,但是此處有可能出現異常
        return temp ;
    }
};
public class ThrowsDemo01{
    public static void main(String args[]){
        Math m = new Math() ;        // 實例化Math類對象
        try{
            System.out.println("除法操作:" + m.div(10,2)) ;
        }catch(Exception e){  e.printStackTrace() ; // 打印異常
        }
    }
};

因為div使用了throws關鍵字聲明,所以調用此方法的時候,方法必須進行異常處理。通過try...catch;

 

如果在主方法的聲明也使用了throws關鍵字呢,那么是不是意味着主方法也可以不處理異常。

class Math{
    public int div(int i,int j) throws Exception{    // 定義除法操作,如果有異常,則交給被調用處處理
        int temp = i / j ;    // 計算,但是此處有可能出現異常
        return temp ;
    }
};
public class ThrowsDemo02{
    // 在主方法中的所有異常都可以不使用try...catch進行處理
    public static void main(String args[]) throws Exception{
        Math m = new Math() ;        // 實例化Math類對象
        System.out.println("除法操作:" + m.div(10,0)) ;
    }
};
運行結果:

Exception in thread "main" java.lang.ArithmeticException: / by zero
at methoud.Math.div(ThisDemo06.java:4)
at methoud.ThisDemo06.main(ThisDemo06.java:12)

在本程序中,主方法不處理任何異常,而交給JAVA中最大頭JVM,所以如果在主方法使用了throws關鍵字,則表示一切異常

交給JVM進行處理。默認處理方式也是JVM完成。

throw關鍵字

throw關機字作用是拋出一個異常,拋出的時候是拋出的是一個異常類的實例化對象,

在異常處理中,try語句要捕獲的是一個異常對象,那么此異常對象也可以自己拋出。

package methoud;
public class ThisDemo06{
    public static void main(String args[]){
        try{
            throw new Exception("自己拋着玩的。") ;    // 拋出異常的實例化對象
        }catch(Exception e){
            System.out.println(e) ;
        }
    }
};

范例,throw與throws的應用

在一般開發中,try,,catch,,finally,throw,throws聯合使用的情況是最多的。

例如,現在要使用一個相除的方法,但是在操作之前必須打印“運算開始”的信息,結束之后必須打印“異常結束”。

如果有異常,需要把異常交給異常調用處處理。面對這樣要求,必須全部使用以上關鍵字。

class Math{
    public int div(int i,int j) throws Exception{    // 定義除法操作,如果有異常,則交給被調用處處理
        System.out.println("***** 計算開始 *****") ;
        int temp = i / j ;    // 計算,但是此處有可能出現異常
        System.out.println("***** 計算結束 *****") ;
        return temp ;
    }
};
public class ThrowDemo02{
    public static void main(String args[]){
        Math m = new Math() ;
        try{
            System.out.println("除法操作:" + m.div(10,0)) ;
        }catch(Exception e){
            System.out.println("異常產生:" + e) ;
        }
    }
};
運行結果:

***** 計算開始 *****
異常產生:java.lang.ArithmeticException: / by zero

以上沒有計算結束,因為沒有異常發生了,直接中斷程序操作。所以做以下操作。

package methoud;
class Math{
    public int div(int i,int j) throws Exception{    // 定義除法操作,如果有異常,則交給被調用處處理
        System.out.println("***** 計算開始 *****") ;
        int temp = 0 ;    // 定義局部變量
        try{
            temp = i / j ;    // 計算,但是此處有可能出現異常
        }catch(Exception e){
        }
         System.out.println("***** 計算結束 *****") ;
        return temp ;
    }
};
public class ThisDemo06{
    public static void main(String args[]){
        Math m = new Math() ;
        try{
            System.out.println("除法操作:" + m.div(10,0)) ;
        }catch(Exception e){
            System.out.println("異常產生:" + e) ;
        }
    }
};
運行結果:

***** 計算開始 *****
***** 計算結束 *****
異常產生:java.lang.ArithmeticException: / by zero

這里雖然貌似成功了,但是,這里的異常並沒有拋出去,因為在方法中已經被自動處理了,沒有拋出去。

所以要拋出異常對象,給方法調用處處理,使用throw關鍵字。

package methoud;
class Math{
    public int div(int i,int j) throws Exception{    // 定義除法操作,如果有異常,則交給被調用處處理
        System.out.println("***** 計算開始 *****") ;
        int temp = 0 ;    // 定義局部變量
        try{
            temp = i / j ;    // 計算,但是此處有可能出現異常
        }catch(Exception e){
            throw e ;    //拋出異常。
        }finally{    // 不管是否有異常,都要執行統一出口
            System.out.println("***** 計算結束 *****") ;
        }
        return temp ;
    }
};
public class ThisDemo06{
    public static void main(String args[]){
        Math m = new Math() ;
        try{
            System.out.println("除法操作:" + m.div(10,0)) ;
        }catch(Exception e){
            System.out.println("異常產生:" + e) ;
        }
    }
};

Exception與runtimeException區別

是面試中經常出現的問題。

觀察以下代碼:

package methoud;
public class ThisDemo06{
    public static void main(String args[]){
        String str = "123" ;    // 定義字符串,全部由數字組成
        int temp = Integer.parseInt(str) ; // 將字符串變為int類型
        System.out.println(temp * temp) ;    // 計算乘方
    }
};
parseInt()的定義格式:
public static int parseInt(String s) throws NumberFormatException

此方法明明使用了throws關鍵字拋出異常,為什么不用處理,也可以編譯通過?

 

在JAVA異常處理機制中,

1)如果拋出的是EXception的類型,則必須進行try ..catch進行處理。

2)如果拋出的是RuntimeException的類型,則可以不使用try。。catch處理,一旦發生異常之后,將由JVM處理。

為了保證程序的健康性,在有可能出現異常的時候還是老實使用try  ..catch處理。

自定義異常類。

只需要繼承Exception類就可以自定義異常類。因為JAVA中提供的都是標准異常類(包括一些異常信息),如果需要自己想要

的異常信息就可以自定義異常類。

class MyException extends Exception{    // 自定義異常類,繼承Exception類
    public MyException(String msg){
        super(msg) ;    // 調用Exception類中有一個參數的構造方法,傳遞錯誤信息
    }
};
public class DefaultException{    
    public static void main(String args[]){
        try{
            throw new MyException("自定義異常。") ;     // 拋出異常
        }catch(Exception e){
            System.out.println(e) ;      //打印錯誤信息
        }
    }
}
運行結果:

methoud.MyException: 自定義異常。

總結

throw與throws關鍵字聯合使用問題。

1)throw:拋出異常。

2)throws:在方法聲明處使用,表示此方法不處理異常,而在調用此方法處處理異常。

Exception是必須處理的,而RuntimeException異常是可以不處理的。但是為了保證程序正常運行,最好處理。

如果自定義異常,直接繼承異常即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM