1. 程式人生 > >java實訓 :異常(try-catch執行順序與自定義異常)

java實訓 :異常(try-catch執行順序與自定義異常)

關鍵字: try:執行可能產生異常的程式碼 catch:捕獲異常 finally:無論是否發生異常程式碼總能執行 throws:宣告方法可能要丟擲的各種異常 throw:手動丟擲自定義異常 用 try-catch-finally 異常處理: 情況一(正常執行,無異常): 執行try,執行finally,執行finally塊後的語句 情況二(try中出現異常) 執行到異常語句時(不執行try中異常語句之後的語句),直接跳到catch塊,然後執行finally,再執行finally之後的語句
public class Test2 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
         System.out.println("請輸入被除數:");
        try { // 將開始可能異常的程式碼放入try
            int num1 = in.nextInt();
            System.out.println("接受除數");
            int num2 = in.nextInt();
            System.out.println(num1+"/"+num2+"="+num1/num2);
            //return;
            //異常塊:catch和finally必須至少出現一個,try塊必須有
        }catch (InputMismatchException e){//try中有匹配的異常,異常後的語句均不執行,直接呼叫catch,然後執行catch塊之後的程式,若有異常但不匹配,不執行catch塊,程式直接結束
            System.out.println("出現錯誤,被除數和除數必須為整數");
            //e.printStackTrace();//輸出異常堆疊資訊,列印錯誤序列,呼叫過程
            e.getMessage();
            //System.exit(1);
            return;
        }catch (ArithmeticException e){
            System.out.println("被除數不可為0");
            e.printStackTrace();
        }finally {//無論是否發生異常,異常是否匹配,都會執行finally,若catch呼叫System.exit(1);finally與finally之後語句均不執行
            System.out.println("感謝使用");
        }
        System.out.println("finally之後語句");
特殊情況之try中含有return: a.無異常(執行順序): 1.return之前的程式碼 2.finally 3.return語句 4.執行完成(不會執行return之後語句,也不會執行finally塊之後的語句) b.有異常(執行順序): 1.異常之前與異常程式碼 2.catch語句 3.finally塊 4.finally塊之後語句 5.執行完畢(因為異常直接跳到catch塊,所以try中return不會執行)   特殊情況之catch中含有return a.無異常(執行順序): 1.執行try程式碼塊 2.執行finally塊 3.執行finally之後的語句 4.退出(無異常,所以不執行catch,直接執行finally) b.有異常(執行順序): 這裡有兩種情況 情況一(異常匹配到的程式碼塊中有return): 1.執行try塊(異常語句後的try語句均不執行)2.執行catch塊return之前的語句 3.執行finally塊 4.執行catch中的return語句 5.退出 情況二(異常匹配到的程式碼塊無有return,catch在其他chtch塊中) 執行到異常語句時(不執行try中異常語句之後的語句),直接跳到catch塊,然後執行finally,再執行finally之後的語句 catch塊的執行原理: 對於異常的捕獲,可以有多個catch,對於try發生的異常,他會根據發生的異常和catch裡面的異常型別進行匹配(按照catch塊從上往下匹配,但並不會執行不匹配的catch塊語句),當他匹配到某個catch塊時,他就直接進入這個catch塊內,忽略這個catch塊後面的所有catch塊,所以,一般將catch(Exception e)放在最後,catch塊承先子類後父類排列。   注意:無論是否發生異常,異常是否匹配,均會執行finally塊,阻止finally執行的唯一方法是在catch塊中呼叫 System.exit(1) 語句(System.exit(1)表示非正常退出程式)。     用 throw 進行異常處理: 開發方法遇到異常時,開發人員不一定要一定去處理這個異常,可以用throws向上繼續丟擲這個異常(異常可以丟擲多個,每個用逗號隔開),強制呼叫者處理這個異常,呼叫者可以用try-catch處理,也可以繼續向上宣告,若在main方法處繼續向上宣告,就會讓jvm去處理這個異常。 自定義異常: 第一步:若需要自定義異常名字,需新建一個類MyException,並讓它繼承Exception;重寫構造方法, 若不需要自定義異常名字,則可以略過第一步,在第二步直接書寫 throw new Exception("");
public class MyEcxeption extends Exception {
    public MyEcxeption(String message) {
        super(message);
    }
}
第二步:在你需要的類中引用他(需要用關鍵字throw),注意,在引用類必須丟擲這個異常
public void setSex(String sex) throws MyException{
    if (sex.equals("男") || sex.equals("女") ){
        this.sex = sex;
    }else {
        throw new MyException("性別必須為男或女");
    }

}
throw與throws的區別: throw自行定義並丟擲異常,位於方法體內部,只可以跟一個異常物件 throws丟擲異常,位於方法引數列表後,可以跟多個異常類