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{}
帶有異常聲明的方法覆蓋:
子類中的方法,不能拋出比父類更多、更寬的異常;