JavaSe之異常處理篇



JavaSe之異常處理篇
1.Java異常處理的分類
Java 異常可分爲可檢測異常,非檢測異常和自定義異常。
可檢測異常
        可檢測異常經編譯器驗證,對於聲明拋出異常的任何方法,編譯器將強制執行處理或聲明規則,例如:sqlExecption 這個異常就是一個檢測異常。你連接 JDBC 時,不捕捉這個異常,編譯器就通不過,不允許編譯。

非檢測異常
        非檢測異常不遵循處理或聲明規則。在產生此類異常時,不一定非要採取任何適當操作,編譯器不會檢查是否已解決了這樣一個異常。例如:一個數組爲 3 個長度,當你使用下標爲3時,就會產生數組下標越界異常。這個異常 JVM 不會進行檢測,要靠程序員來判斷。有兩個主要類定義非檢測異常:RuntimeException 和 Error。         

Error 子類屬於非檢測異常,因爲無法預知它們的產生時間。若 Java 應用程序內存不足,則隨時可能出現 OutOfMemoryError;起因一般不是應用程序的特殊調用,而是 JVM 自身的問題。另外,Error 一般表示應用程序無法解決的嚴重問題。

RuntimeException 類也屬於非檢測異常,因爲普通 JVM 操作引發的運行時異常隨時可能發生,此類異常一般是由特定操作引發。但這些操作在 Java 應用程序中會頻繁出現。因此,它們不受編譯器檢查與處理或聲明規則的限制。

自定義異常
       自定義異常是爲了表示應用程序的一些錯誤類型,爲代碼可能發生的一個或多個問題提供新含義。可以顯示代碼多個位置之間的錯誤的相似性,也可以區分代碼運行時可能出現的相似問題的一個或者多個錯誤,或給出應用程序中一組錯誤的特定含義。例如,對隊列進行操作時,有可能出現兩種情況:空隊列時試圖刪除一個元素;滿隊列時試圖添加一個元素。則需要自定義兩個異常來處理這兩種情況。

2.Java異常類的層次結構
           

在 Java 中,所有的異常都有一個共同的祖先 Throwable(可拋出)。Throwable 指定代碼中可用異常傳播機制通過 Java 應用程序傳輸的任何問題的共性。

Throwable 有兩個重要的子類:Exception(異常)和 Error(錯誤),二者都是 Java 異常處理的重要子類,各自都包含大量子類。

Exception(異常)是應用程序中可能的可預測、可恢復問題。一般大多數異常表示中度到輕度的問題。異常一般是在特定環境下產生的,通常出現在代碼的特定方法和操作中。在 EchoInput 類中,當試圖調用 readLine 方法時,可能出現 IOException 異常。

Error(錯誤)表示運行應用程序中較嚴重問題。大多數錯誤與代碼編寫者執行的操作無關,而表示代碼運行時 JVM(Java 虛擬機)出現的問題。例如,當 JVM 不再有繼續執行操作所需的內存資源時,將出現 OutOfMemoryError。

Exception 類有一個重要的子類 RuntimeException。RuntimeException 類及其子類表示“JVM 常用操作”引發的錯誤。例如,若試圖使用空值對象引用、除數爲零或數組越界,則分別引發運行時異常(NullPointerException、ArithmeticException)和 ArrayIndexOutOfBoundException。還有一類是非RuntimeException這一類的異常是必須要捕獲的異常(在使用別人的方法的時候別人拋出來的異常我們就必須要捕獲) 而RuntimeException是可以捕獲也可以不捕獲的異常

3.Java異常處理的使用

     1.使用try...catch來捕獲異常  

		try {
			//........
		    } catch (Exception e) {
			e.printStackTrace();
		    }
	try {
			try {
				
			} catch (Exception e1) {
				e1.printStackTrace();
			}
		} catch (Exception e2) {
			e2.printStackTrace();
		}

      2.在方法上拋出異常

        

public static void test1() throws Exception{
		//.......
	}
    3. 在方法內部拋出異常(當程序運行到某個語句的時候,一般是程序員自定義異常)

public static void test1(){
		if(1<2){
			throw MyException();
		}
	}
   4.一般在處理異常之後我們需要關閉一些資源或者臨時文件 這時候我們就需要使用finally關鍵字

    finally關鍵字是在方法最後執行的語句塊 不管有沒有異常拋出---在jdbc操作的過程中很常見

public static void test1() throws MyException{
		if(1<2){
			throw MyException();
		}finally{
			///最後執行
		}
	}
    5.注意在有異常拋出的方法中當異常拋出的時候 語句會直接跳到catch語句塊中而不會執行有異常語句的下面一些語句

       在程序員自定的異常的時候跑出來的時候 我們需要在方法上拋出用來給後面的方法使用

4.Java異常處理的應用實例

在定義銀行類時,若取錢數大於餘額時需要做異常處理。

定義一個異常類 insufficientFundsException。取錢(withdrawal)方法中可能產生異常,條件是餘額小於取額。

處理異常在調用 withdrawal 的時候,因此 withdrawal 方法要聲明拋出異常,由上一級方法調用。

異常類:

class InsufficientFundsException extends Exception {
	private Bank excepbank; // 銀行對象
	private double excepAmount; // 要取的錢

	InsufficientFundsException(Bank ba, double dAmount) {
		excepbank = ba;
		excepAmount = dAmount;
	}

	public String excepMessage() {
		String str = "The balance is" + excepbank.balance + "\n"
				+ "The withdrawal was" + excepAmount;
		return str;
	}
}
銀行類:
class Bank {
	double balance;// 存款數

	Bank(double balance) {
		this.balance = balance;
	}

	public void deposite(double dAmount) {
		if (dAmount > 0.0)
			balance += dAmount;
	}

	public void withdrawal(double dAmount) throws InsufficientFundsException {
		if (balance < dAmount)
			throw new InsufficientFundsException(this, dAmount);
		balance = balance - dAmount;
	}
	public void showBalance() {
		System.out.println("The balance is " + (int) balance);
	}
}
測試類:
public class ExceptionDemo {
	public static void main(String args[]) {
		try {
			Bank ba = new Bank(50);
			ba.withdrawal(100);
			System.out.println("Withdrawal successful!");
		} catch (InsufficientFundsException e) {
			System.out.println(e.toString());
			System.out.println(e.excepMessage());
		}
	}
}

     
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章