《Java》Java“異常捕捉機制”實際應用
一、任務目標
1.完成一個 java application應用程式,完成c=a/b 的計算並輸出c的結果,可以為a和b在程式中賦初值、或者接收使用者通過鍵盤輸入a和b的數值文字後轉換為數字等,在程式要求當 b 為0時c的計算結果正確。
2.完成一個 java application應用程式,完成一個計算絕對值表示式 |a-b|的功能。要求當b比a大時人為丟擲一個自定義異常,在計算絕對值時通過異常捕捉機制完成此絕對值表示式的計算。
二、“異常”概述
1. 異常
在程式中,錯誤可能產生於程式設計師沒有預料到的各種情況,在Java中這種在程式執行時可能出現的一些錯誤成為異常。異常是一個在程式執行期間發生的事情,它中斷了正在執行的程式的正常指令流。如下圖:
程式執行的結果報告發生了算術異常,在算術表示式“3/0”中,0作為除數出現,系統不再執行下去,提前結束。
2. 捕捉異常
2.1. try、catch和finally語句
Java語言的異常捕獲結構由 try、catch和finally 3部分組成。其中,try 語句塊存放的是可能發生異常的 Java 語句;catch 程式塊在 try 語句塊之後,用來激發被捕捉的異常;finally 語句塊是異常處理結構的最後執行部分,無論 try 語句塊中的程式碼如何退出,都將執行 finally 語句塊。
語法如下:
try{
//程式塊程式碼
}
catch(Exceptiontype e) {
//對Exceptiontype e的處理
}
...
finally{
//程式塊
}
2.2. try — catch語句塊
try — catch語句塊執行原理流程圖:
當 try 程式碼塊中的語句發生異常時,程式就會跳轉到 catch 程式碼塊中執行,執行完 catch 程式碼塊的其他程式碼,而不會執行 try 程式碼塊中發生異常語句後的程式碼。由此可知,Java的異常處理是結構化的,不會因為一個異常影響整個程式的執行。
3. 自定義異常
使用Java內建異常類可以描述在程式設計時出現的大部分異常情況。除此之外,使用者只需要繼承Exception類即可自定義異常類。
在程式中使用自定義異常類,大體克分為可分為以下幾個步驟:
(1)建立自定義異常類。
(2)在方法中通過throw類關鍵字丟擲異常物件。
(3)如果在當前丟擲異常的方法中處理異常,可以使用try-catch語句塊捕獲並處理,否則在方法的宣告處通過throws關鍵字指明要丟擲給方法呼叫的異常,繼續進行下一步操作。
(4)在出現異常方法的呼叫者中捕獲並處理異常。
public class MyException(子類名) extends Exception{ //建立自定義方法,繼承Exception類
public MyException(String ErroorMessage){ //構造方法
super(ErroorMessage) //父類構造方法
}
static int avg(int number1,int number 2)throws MyException{ //定義方法,丟擲異常
//語句塊
}
public static void main(String[] args){ //主方法
try{ //try方法程式碼塊處理可能出現異常的程式碼
int result = avg(102,150);
}catch (MyException e){
System.out.println(e);
}
}
}
三、“異常捕捉機制”實際應用
任務1:
程式程式碼:
import java.util.Scanner; //匯入Scanner類
class Count //建立類Count
{
public static void main(String[] args) //主函式
{
System.out.println("請輸入a的值:");
Scanner str1 = new Scanner(System.in); //鍵入a的值並存入String型別變數str1中
int a = Integer.valueOf(str1.nextLine()); /*nextline()方法讀取a的值並通過valueOf()方法
將String型別的資料轉換為int型資料*/
System.out.println("請輸入b的值:"); //鍵入b的值並存入String型別變數str2中
Scanner str2 = new Scanner(System.in);
int b = Integer.valueOf(str2.nextLine());
int c = 0;
try{ //try程式碼塊處理可能出現的異常資訊
c = a/b;
}catch(Exception e){
System.out.println("除數b不能為0,請重新輸入b的值:");
Scanner str3 = new Scanner(System.in);
int B = Integer.valueOf(str3.nextLine());
c = a/B;
}
System.out.println("c = "+c);
}
}
執行結果:
任務2:
程式程式碼:
import java.util.Scanner; //匯入Scanner類
class Tran { //建立類Tran
static class MyException extends Exception{ //建立自定義方法,繼承Exception類
public MyException(String Error){ //構造方法
super(Error); //父類構造方法
}
}
public static void absolute(int num1, int num2)throws MyException {
if(num2 > num1){ //定義方法,丟擲異常
throw new MyException("b大於a"); //錯誤資訊
}
}
public static void main(String[] args) { //主函式
// TODO Auto-generated method stub
System.out.println("請輸入a的值:");
Scanner str1 = new Scanner(System.in); //鍵入a的值並存入String型別變數str1中
int a = Integer.valueOf(str1.nextLine());
System.out.println("請輸入b的值:"); //鍵入b的值並存入String型別變數str2中
Scanner str2 = new Scanner(System.in);
int b = Integer.valueOf(str2.nextLine()); /*nextline()方法讀取a的值並通過valueOf()方法
將String型別的資料轉換為int型資料*/
int c = 0;
try{ //try程式碼塊處理可能出現的異常資訊
c = a - b;
absolute(a,b); //呼叫方法,丟擲異常
}catch(MyException e){
c = b - a;
}
System.out.println("|a - b| = " +c);
}
}
執行結果: