1. 程式人生 > >《Java》Java“異常捕捉機制”實際應用

《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);
	}
}

執行結果:
在這裡插入圖片描述