本次範例的目的很簡單,就是由使用者輸入兩個數位,然後進行相除並輸出結果。但是要求程式對除法運算過程中的各種異常進行捕捉並提示使用者,例如除數是字元、被除數是零等。
在這個範例中定義了一個陣列來存放要執行運算的兩個運算元,因此還需要對陣列的索引越界異常進行處理,具體步驟如下。
1)建立計算類 Compute,宣告一個長度為 2 的 int 型別陣列,接著編寫 get() 和 set() 方法,程式碼如下:
public class Compute {
private int[] num = new int[2];
public int[] getNum() {
return num;
}
public void setNum(int[] num) {
this.num = num;
}
}
2)在 Compute 類的 main() 方法中編寫測試程式碼。定義一個 int 型別的變數 res 來接收計算的結果,將從控制台接收到的 int 型別的資料儲存到陣列中,如果輸入 Y 表示將計算的結果儲存到陣列下標為 2 的位置,接著在控制台輸出結果。程式碼如下:
public class Test04 {
public static void main(String[] args) {
Compute c = new Compute();
int array[] = c.getNum();
int res = 0;
String YorN = null;
Scanner in = new Scanner(System.in);
try {
System.out.println("請輸入第一個整數:");
array[0] = in.nextInt();
System.out.println("請輸入第二個整數:");
array[1] = in.nextInt();
res = array[0] / array[1];
System.out.println("是否儲存結果請輸入Y或者N");
YorN = in.next();
if (YorN.equals("Y")) {
array[2] = res;
}
System.out.println(array[0] + "除以" + array[1] + "的結果是:" + res);
}
}
}
3)使用 catch 分別捕獲可能出現的異常,程式碼如下。
catch (ArrayIndexOutOfBoundsException e) {
System.out.println("出現陣列越界錯誤,下標過大或者過小。");
} catch(ArithmeticException e) {
System.out.println("出現算術運算錯誤,被除數不能為0。");
} catch(InputMismatchException e) {
System.out.println("輸入的資料型別不匹配,只能輸入數位。");
} catch(Exception e) {
System.out.println("發生未知錯誤。");
}
4)執行程式,先輸入一個整數,接著第二個數輸入 0,此時程式發生算術運算異常,異常被異常型別為 ArithmeticException 的 catch 語句塊捕獲,控制台會輸出“出現算術運算錯誤,被除數不能為0。”,執行效果如下所示。
請輸入第一個整數:
100
請輸入第二個整數:
0
出現算術運算錯誤,被除數不能為0。
5)重新執行程式,先輸入一個整數,接著第二個數中輸入一個字元,此時程式發生型別不匹配異常,異常被異常型別為 InputMismatchException 的 catch 語句塊捕獲,控制台會輸出“輸入的資料型別不匹配,只能輸入數位。”,執行效果如下所示。
請輸入第一個整數:
100
請輸入第二個整數:
9t
輸入的資料型別不匹配,只能輸入數位。
6)繼續執行程式,輸入兩個整數,然後控制台輸出“是否儲存結果請輸入Y 或者 N”。此時輸入“Y”,程式發生陣列越界異常,因為長度為 2 的陣列,其下標最大為 1。將結果儲存在 array[2] 時出現陣列越界錯誤,控制台輸出“出現陣列越界錯誤,下標過大或者過小”。執行效果如下所示。
請輸入第一個整數:
100
請輸入第二個整數:
10
是否儲存結果請輸入Y或者N
Y
出現陣列越界錯誤,下標過大或者過小。
7)再次執行程式,輸入兩個整數。當控制台輸出“是否儲存結果請輸入Y或者N”時,輸入“N”,表示不儲存執行結果,也就不需要對下標為 2 的地址空間的存取,那麼不會發生陣列越界異常,程式可以順序執行到 try 語句塊中的最後一個輸出語句。執行效果如下所示。
請輸入第一個整數:
100
請輸入第二個整數:
20
是否儲存結果請輸入Y或者N
N
100除以20的結果是:5