JavaSE學習筆記之-----異常處理

一、異常的概念

    是一種Java處理程序在運行時而不是編譯時的錯誤機制,出現異常事件的時候會生成異常對象,該異常對象封裝了異常事件的信息並將提供給Java運行時系統。

    Java的異常類分爲可捕獲和必須捕獲兩類,



舉給例子,ArithmeticException這個異常,就是RuntimeException下面的,比如程序中除數是0的時候就會拋出這個異常。Error是程序中無法處理的錯誤,是虛擬機層次的,而Exception是可以在程序中處理的,Exception下面的RuntimeException是可以捕獲也可以不捕獲的異常,除此之外的異常都是必須捕獲的,ArithmeticException異常的繼承關係如下圖


public class exc {
	exc() {
			System.out.println(2/0);
		}
	public static void main(String[] args) {		
		exc test = new exc();
	}
}

編譯是沒問題的,輸出如下:


提示說在main裏面有異常發生。System.out.println(2/0);這一句的異常如何捕獲:

public class exc {
	exc() {
		try{
			System.out.println(2/0);
		}catch (ArithmeticException e) {
			System.out.println("除數不能爲0");
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {		
		exc test = new exc();
	}
}

e.printStackTrace();
這是把堆棧信息打印出來,就是錯誤的詳細信息,不加這一行,輸出結果就只有“除數不能爲0”

上面的e實際上是一個對象名,有異常發生的時候,會生成異常對象,這個名字是可以隨便取的。


二、方法聲明和拋出異常

    定義一個方法,但是這個方法有可能在運行的時候拋出異常,見下面程序:

public void method() throws SomeException {
	if (something) {
		throw new SomeException("錯誤提示");
	}
}

在方法名後面用throws關鍵字聲明這個方法有可能會拋出異常, SomeException是舉例拋出的異常名字,方法體裏面滿足某條件以後就用關鍵字throw來拋出異常。

調用該方法的時候,要捕獲異常(當然有些異常是不用捕獲的RuntimeException)

 

try {
	method();	
}catch (SomeException e) {
	//捕獲以後的處理代碼
}

多個異常,可以一個try多個catch

void f() throws FileNotFoundException , IOException {
    FileInputStream in = new FileInputStream("myfile.txt");
    int b;
    b = in.read();
    while (b != -1) {
        System.out.print((char) b);
        b = in.read();
    }
}
	
void f2() throws IOException {		
    try {
      f();
    } catch (FileNotFoundException e) {
      System.out.println(e.getMessage());
    } catch (IOException e) {
      e.printStackTrace();
    }
		
}

當異常發生的時候,程序會終止當前流程,根據捕獲的異常類型去執行相應的catch代碼段。


三、finally關鍵字

    finally裏面的語句是始終都要執行的。



格式類似如下:

try {
	method();	
}catch (SomeException e) {
	//捕獲以後的處理代碼
}catch (SomeException1 d) {
	//捕獲以後的處理代碼
}finally {
	//do something
}

四、注意點

    1、多個捕獲catch的時候,不能先捕獲大的,再捕獲小的,比如:

try {
	method();	
}catch (Exception e) {
	//捕獲以後的處理代碼
}catch (ArrayIndexOutOfBoundsException d) {
	//捕獲以後的處理代碼
}

這裏第一次捕獲的是Exception,已經包含了所有的異常,下面再捕獲數組越界異常,就會報錯,因爲前者已經包含後者。

    2、重寫一個方法的時候,原方法所拋出的異常是什麼類型,重寫以後就必須是拋出什麼類型,或者重寫以後選擇不拋出也可以,如果要拋出,就必須和原方法一模一樣。

發佈了44 篇原創文章 · 獲贊 36 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章