本程式在 try 區的程式碼只有三種可能會出現的例外,除以 0 、陣列溢位、使用方法的輸入參數不符、物件為 null 的情況,但我 catch 的部份還是多寫了儲存陣列元素型態不符,主要是為了日後查指令時方便。
主程式中利用亂數決定要用陣列的哪個元素進行轉整數與相除運算,所以每一次出現的情況可能會不同,可能順利的完成,也可能產生例外。
順道一題, catch 捕捉的物件名稱都一樣,只是型別不同,這跟多載(過載)相同, JAVA 會自動找合適的 catch 去捕捉物件。
程式碼:
public class Main {
// 類別方法,顯示例外訊息。
static void showErr(Exception ecp){
// Exception 是其它例外類別的父類別,所以可以用渣男寫法。
System.out.println("發生例外:" + ecp.getMessage());
//System.out.println("原因如下:");
}
public static void main(String[] args){
String[] text = { null, "44", "22", "11", "0",
"愛未未","恨已已","情深深","仇切切"};
try{ // 這邊寫可能會出現例外的程式碼,執行時若出現例外,會丟出例外物件給 catch 。
int i,ratio;
double r = Math.random()*10;
i = (int)(r);
System.out.println("亂數 r = " + r + ",小數捨去化為整數 i = " + i);
ratio = Integer.parseInt(text[i])/Integer.parseInt(text[i+1]);
System.out.println("參數比例 = "+ratio);
}
catch (ArithmeticException ecp){ // 捕捉【除以 0 的例外物件】。
showErr(ecp);
}
catch (ArrayIndexOutOfBoundsException ecp){ // 補捉【陣列溢位的例外物件】。
showErr(ecp);
}
catch (ArrayStoreException ecp){ // 捕捉【陣列儲存型態不符的例外物件】。
showErr(ecp);
}
catch (IllegalArgumentException ecp){
// 捕捉【使用的方法時,丟入的參數型態不同的例外物件】。
showErr(ecp);
}
catch (NullPointerException ecp) { // 捕捉【物件值為 null 的例外物件】。
showErr(ecp);
}
finally {
System.out.println("無論有沒有出現例外都會出現這一行!");
}
System.out.println("程式結束了!");
}
}
結果:
亂數 r = 5.228886020103869,小數捨去化為整數 i = 5
發生例外:For input string: "愛未未"
無論有沒有出現例外都會出現這一行!
程式結束了!
Process finished with exit code 0
我手邊的書還有丟出例外與自訂例外類別,暫且就先跳過。執行緒的部份,不想花時間改程式碼以避開著作權,所以決定練習不放上來。
沒有留言:
張貼留言