——java異常機制

---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity開發</a>、<a href="http://www.itheima.com"target="blank">.Net培訓</a>、期待與您交流! ----------------------

異常:

  什麼是異常?

      異常時對問題的描述,將問題進行對象封裝。

  異常體系:

Throwable

   |--Error

|--多個子類

   |--Exception

|--RuntimeException 其中以個特殊的子類

 |--其他的多個子類

   異常體系的特點:

異常體系中的所有類及其產生的對象都具有可拋性,

就是說可以被throw和throws關鍵字操作。

只有異常體系具備這樣的特點!

   Exception異常有兩種:

編譯時被檢測異常

   該異常在編譯時,如果沒有處理(沒有拋出),編譯失敗。

   該異常被標識,代表可以被處理。

運行時異常(編譯時不檢測)

   在編譯時,不需要處理,編譯器不檢測。

   該異常的發生,建議不處理,讓程序停止。需要對代碼進行修正。 


  throw和throws的用法和區別:

throw定義在方法內部,用於拋出異常對象。

throws定義在函數上,用於聲明拋出的異常類,可以聲明多個,用逗號隔開。



  當函數內容有throw拋出異常對象,並未進行try處理。必須要再函數上聲明,否則編譯失敗。

  注:RuntimeException 除外。即,函數內如果拋出RuntimeException 異常,函數上可以不聲明異常類。


  如果函數聲明瞭異常,調用者需要進行處理。處理方式有throws或者try。

  處理方式一:try--catch塊

注:在使用多路異常捕捉時,子類要再父類前面

  1,try--catch--catch

  try {

//被檢測的代碼

  } 

  catch (IOException e) {//子類異常

// TODO: handle exception

  }//...可以有多個catch塊

  catch (Exception e) {//父類異常

// TODO: handle exception

  }



  2,try--catch--finally

  try {

//被檢測的代碼

  } 

  catch (Exception e) {

// TODO: handle exception

  } 

  finally {

//始終要執行的代碼

  }


  3,try--finally

  try {

//被檢測的代碼

  } 

  finally {

//始終要執行的代碼

  }

  注意:

1,finally中定義的通常是,關閉源代碼。因爲資源必須釋放。

2,finally中有一種情況不會執行,當執行到System.exit(0);finally不會執行。


自定義異常:

定義類繼承Exception或者RuntimeException

1,爲了讓該類具有可拋性。

2,讓該類具備操作異常的共性方法。


當要定義自定義異常的信息時,可以使用父類已經定義好的功能。

異常信息傳遞給父類的構造函數。

自定義異常類實例代碼:

public class MyException extends Exception{

//定義參構造函數,並將參數傳給父類對應的構造函數。

public MyException(String message){

super(message);

}

}

自定義異常類:按照java面向對象思想,將程序中出現的特有問題進行封裝。


異常的好處:

1,將問題進行封裝,

2,將正常流程代碼與異常處理代碼相分離,編譯閱讀。

異常處理的原則:

1,處理方式有兩種:try或者throws拋。

2,調用到拋出異常的功能時,拋出幾個就處理幾個。

  一個try塊可以有多個catch。

3,多個catch,父類要放到最後。

4,catch內,需要定義針對性的處理方式,不要簡單的定義printStackTrace()等默認的輸出語句;

  也不要不寫。

  當捕捉到異常,本功能處理不了是,可以繼續在catch中拋出。

  try {

throw new Exception();

  } catch (Exception e) {

throw e;

  }



  如果該異常類處理不了,但並不屬於該功能出現的異常。

  可以將異常轉換後,在拋出和該異常相關的異常。

  或者異常可以處理,當需要將異常產生的和本功能相關的問題提供出去,

  讓調用者知道,並處理。也可以將捕獲異常處理後轉換新的異常。

  try {

throw new Exception();

  } catch (Exception e) {

throw new MyException("異常轉換了。");

  }

異常注意事項:

在子父類覆蓋時:

1,子類拋出的異常,必須是父類的異常本身,或子類或子集。

2,如果父類或者接口沒有異常拋出是,子類覆蓋出現異常,只能try,不能throws。

代碼參考如下:

package com.itheima.exception.exceptioncase;

/**
 * 課堂異常測試類
 * @author wuyong
 *
 */
public class SchoolExceptionTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//實例化老師類對象
		Computer com = new Computer();
		
		//電腦類對象
		Teacher teac = new Teacher(com);
		
		//1標識電腦藍屏
		com.setState(1);
		
		//2標識電腦冒煙
//		com.setState(2);
		try {
			com.run();
			teac.teach();
		} catch (BlueScreenException e) {//藍屏異常
			System.out.println(e.toString());
			com.reset();
			teac.teach();
		} catch (SmokingException e) {//冒煙異常
			System.out.println(e.toString() + ",課程無法繼續");
		}
	}
}
/**
 * 電腦類
 * @author wuyong
 *
 */
class Computer {
	//電腦狀態,1表示藍屏,2,表示冒煙
	private int state;
	public int getState() {
		return state;
	}
	public void setState(int state) {
		this.state = state;
	}
	/**
	 * 構造函數
	 */
	public Computer(){}
	public Computer(int state){
		this.state = state;
	}
	/**
	 * 運行方法
	 * @throws BlueScreenException
	 * @throws SmokingException
	 */
	public void run() throws BlueScreenException, SmokingException {
		if (state == 1) {
			throw new BlueScreenException("電腦藍屏了。");
		}
		if (state == 2) {
			throw new SmokingException("電腦冒煙了");
		}
		System.out.println("電腦運行");
	}
	/**
	 * 重啓方法
	 */
	public void reset() {
		state = 0;
		System.out.println("電腦重啓");
	}
}
/**
 * 老師類
 * @author wuyong
 *
 */
class Teacher {
	private Computer com;
	public Teacher(){}
	public Teacher(Computer com){
		this.com = com;
	}
	/**
	 * 上課
	 */
	public void teach() {
		System.out.println("老師講課");
	}
}
/**
 * 自定義電腦藍屏異常類
 * @author wuyong
 *
 */
class BlueScreenException extends Exception {
	public BlueScreenException(String message){
		super(message);
	}
}
/**
 * 自定義電腦冒煙異常類
 * @author wuyong
 *
 */
class SmokingException extends Exception {
	public SmokingException(){}
	public SmokingException(String message){
		super(message);
	}
}
---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity開發</a>、<a href="http://www.itheima.com"target="blank">.Net培訓</a>、期待與您交流! ----------------------



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