java實訓 :異常(try-catch執行順序與自定義異常)
阿新 • • 發佈:2019-06-01
關鍵字:
try:執行可能產生異常的程式碼
catch:捕獲異常
finally:無論是否發生異常程式碼總能執行
throws:宣告方法可能要丟擲的各種異常
throw:手動丟擲自定義異常
用 try-catch-finally 異常處理:
情況一(正常執行,無異常):
執行try,執行finally,執行finally塊後的語句
情況二(try中出現異常)
執行到異常語句時(不執行try中異常語句之後的語句),直接跳到catch塊,然後執行finally,再執行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("");
第二步:在你需要的類中引用他(需要用關鍵字throw),注意,在引用類必須丟擲這個異常
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之後語句");
public class MyEcxeption extends Exception { public MyEcxeption(String message) { super(message); } }
public void setSex(String sex) throws MyException{ if (sex.equals("男") || sex.equals("女") ){ this.sex = sex; }else { throw new MyException("性別必須為男或女"); } }throw與throws的區別: throw自行定義並丟擲異常,位於方法體內部,只可以跟一個異常物件 throws丟擲異常,位於方法引數列表後,可以跟多個異常類