學習Java第二十七天--異常之自定義異常

13.7 自定義異常

  • 需要繼承自Exception或Exception的子類,常用RuntimeException;
  • 必要提供的構造方法:
    無參數構造方法
    String message參數的構造方法
public class TestDefinedException {

	public static void main(String[] args) {
		Student stu = new Student();
		try {
			stu.setAge(124);//可能出現異常的代碼
		}catch(Exception e) {
			System.out.println(e.getMessage());
		}
		
		try {
			stu.setSex("未知");
		}catch(SexMismatchException se){
			System.err.println(se.getMessage());//err用紅色字體輸出
		}catch(Exception e) {
			e.printStackTrace();
		}

	}

}

//受查異常(是在編譯期間就要處理的異常,需要聲明出去)
class SexMismatchException extends Exception{
	
	public SexMismatchException() {}
	public SexMismatchException(String message) {
		super(message);
	}
	
}

//運行時異常
class AgeInputException extends RuntimeException{
	
	public AgeInputException() {}//支持創建無異常原因信息的異常對象
	public AgeInputException(String message) {//提供有參構造方法,支持編寫異常原因信息
		super(message);//調用父類的有參構造方法,爲massage屬性賦值
	}
}

class Student{
	private int age; 
	private String sex;
	
	public int getAge() {
		return this.age;
	}
	public void setAge(int age) {
		if(age > 0 && age < 123) {
			this.age = age;
		}else {
			throw new AgeInputException("年齡輸入應大於0小於123");
		}
	}
	
	public String getSex() {
		return this.sex;
	}
	public void setSex(String sex) throws SexMismatchException{//告知調用者,使用該方法可能會產生異常,最好聲明與該異常類型一致的異常
		if(sex.equals("男") || sex.equals("女")) {
			this.sex = sex;
		}else {
			//在用戶輸入一個性別後,性別的輸入可能不準確。受查異常
			throw new SexMismatchException("性別輸入的值爲“男”或“女”");
		}
	}
}

輸出結果:

年齡輸入應大於0小於123
性別輸入的值爲“男”或“女”

13.8 方法覆蓋

  • 帶有異常聲明的方法覆蓋:
    方法名、參數列表、返回值類型必須和父類相同;
    子類的訪問修飾符符合父類相同或是比父類更寬;
    子類中的方法,不能拋出比父類更多、更寬的異常;
public class TestOverrideExceptionMethod {

	public static void main(String[] args) {
		
		Super sup = new Sub();//父類引用指向子類對象 多態
		try {
			sup.method();//在編譯期間,調用的父類中聲明的方法是有異常的,需要處理
		}catch(Exception e) {
			e.printStackTrace();//處理方案之1:打印堆棧跟蹤信息
		}

	}

}

//帶有異常的方法覆蓋
//1.父類中方法聲明瞭異常,子類重寫後可聲明也可不聲明
//2.父類中方法沒有聲明異常,則子類也不可以聲明異常
//3.父類中方法聲明瞭異常,子類可以聲明的異常與其相等或是其子類
//4.子類可以聲明比父類更多的異常,必須小於其父類聲明的異常
class Super{
	public void method() throws Exception{
		System.out.println("method in super");
	}
}
class Sub extends Super{
	public void method() throws ClassNotFoundException , RuntimeException{
		System.out.println("method in sub");
	}
}

輸出結果:

年齡輸入應大於0小於123

13.9 總結

  • 異常的概念:
    程序在運行過程中出現的特殊情況;

  • 異常的分類:
    RuntimeException:運行時異常,可處理,可不處理;
    ChickedException:受查異常,必須處理;

  • 異常的產生:
    throw new 異常類型(“實際參數”);
    相當於遇到return語句,導致程序因異常而終止;

  • 異常的傳遞:
    按照方法的調用鏈反向傳遞,如始終沒有處理異常,最終會由JVM進行默認異常處理(打印堆棧跟蹤信息);

  • 異常的處理:
    try{} catch {} finally{}
    帶有異常聲明的方法覆蓋:
    子類中的方法,不能拋出比父類更多、更寬的異常;

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