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拋出異常,位於方法參數列表后,可以跟多個異常類
 


免責聲明!

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



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