[Java] 9.4. 改寫&異常

改寫方法時的throws也必須考異常物件的轉型問題。

 

image/svg+xml9.4. 改寫&異常 - Override & Exception class PersonException extends Exception { PersonException( String errorMsg){ super (errorMsg); } } // ⾝份證字號異常類別( IDException )、 // 姓名異常類別( NameException )、 // 性別異常類別( GenderException )、 // 年齡異常類別( AgeException )皆繼承⾃⼈員異常類別 class Person { private String id; private String name; private String gender; protected int age; // 略過⼀些程式 void setAge ( int newAge) throws AgeException { if (newAge < 0 || newAge > 150 ) throw new AgeException( " 年齡必須介於 0~150 之間 " ); else age = newAge; } } class Employee extends Person { void setAge ( int newAge) throws AgeException { if (newAge < 0 || newAge > 100 ) throw new AgeException( " 年齡必須介於 0~100 之間 " ); else age = newAge; } } class PersonException extends Exception { PersonException( String errorMsg){ super (errorMsg); } } // ⾝份證字號異常類別( IDException )、 // 姓名異常類別( NameException )、 // 性別異常類別( GenderException )、 // 年齡異常類別( AgeException )皆繼承⾃⼈員異常類別 class Person { private String id; private String name; private String gender; protected int age; // 略過⼀些程式 void setAge ( int newAge) throws PersonException { if (newAge < 0 || newAge > 150 ) throw new AgeException( " 年齡必須介於 0~150 之間 " ); else age = newAge; } } class Employee extends Person { void setAge ( int newAge) throws AgeException { if (newAge < 0 || newAge > 100 ) throw new AgeException( " 年齡必須介於 0~100 之間 " ); else age = newAge; } } class PersonException extends RuntimeException { PersonException( String errorMsg){ super (errorMsg); } } // ⾝份證字號異常類別( IDException )、 // 姓名異常類別( NameException )、 // 性別異常類別( GenderException )、 // 年齡異常類別( AgeException )皆繼承⾃⼈員異常類別 class Person { private String id; private String name; private String gender; protected int age; // 略過⼀些程式 void setAge ( int newAge) throws PersonException { if (newAge < 0 || newAge > 150 ) throw new AgeException( " 年齡必須介於 0~150 之間 " ); else age = newAge; } } class Employee extends Person { void setAge ( int newAge) throws AgeException { if (newAge < 0 || newAge > 100 ) throw new AgeException( " 年齡必須介於 0~100 之間 " ); else age = newAge; } } J9_4_1 – PersonExcep 2 on.java 3. 其中的年齡設值式( setAge() )有可能發⽣年齡異常。 J9_4_1 – Employee.java J9_4_1 – Person.java 1. 這是⼈員異常類別( PersonException 繼承⾃異常類別( Exception )。 2. 這是⼈員類別( Person )。 5. 在改寫年齡設值式⽅法時,因為⼈員異常類別不是繼承⾃執⾏時 期異常類別( RuntimeException ),⽽年齡異常⼜是繼承⾃⼈員 異常類別的。因此年齡設值式會拋出年齡異常類別的物件,在改寫 時也必須使⽤ throws 宣告可能會拋出年齡異常類別的物件,以多型 的⾓度思考,員⼯類別是可以轉型成⼈員類別的,若⼈員類別的年 齡設值式會產⽣年齡異常,則員⼯的年齡設值式也必定需要產⽣年 齡異常,且記得改寫後,不論如何轉型皆是⽤改寫後的⽅法。 4. 這是員⼯類別( Employee )繼承⾃⼈員類別。 J9_4_2 – PersonExcep 2 on.java 1. 這是⼈員異常類別( PersonException 繼承⾃異常類別( Exception )。 3. 其中的年齡設值式( setAge() )有可能發⽣年齡異常。 2. 這是⼈員類別( Person )。 4. 這是員⼯類別( Employee )繼承⾃⼈員類別。 5. 多型的技巧,可以讓您在改寫時,以⽗類別-⼈員異常類別 PersonException )概括可能發⽣的年齡異常類別 AgeException ),但特別注意的是,⽗類別的⼈員異常類別必 須是在被改寫的⽗類別上,如此才能在員⼯物件轉型為⼈員型別物 件時,以⽗類別的異常類別概括(多型)可能產⽣的異常。 J9_4_2 – Person.java J9_4_2 – Employee.java J9_4_3 – PersonExcep 2 on.java J9_4_3 – Person.java 1. 這是⼈員異常類別( PersonException 繼承⾃異常類別( Exception )。 3. 其中的年齡設值式( setAge() )有可能發⽣執⾏時期 異常類別( RuntimeException )版本的年齡異常。 2. 這是⼈員類別( Person )。 5. 在改寫年齡設值式⽅法時,因為⼈員異常類別繼承⾃執⾏時期異常 類別( RuntimeException ),這時不論年齡設值式是否使⽤ throws 宣告可能拋出年齡異常類別( AgeException )的物件,這時改寫的⽅ 法可以不使⽤ throws 宣告可能拋出年齡異常類別的物件,因為 Java 是特別優待執⾏時期異常的物件。即使不處理也沒關係。以多型的⾓度 來看也是合理的,因執⾏時期異常類別並不需強制使⽤ try~catch 抓,因此在改寫時可忽略 throws ,且轉型為員⼯型別時,⾏為也⼀ 致,皆可不需使⽤ try~catch 捕抓異常。 4. 這是員⼯類別( Employee )繼承⾃⼈員類別。 J9_4_3 – Employee.java 改寫,需 throws 定義原⽅法可能拋出的 RuntimeException ⽗類別的異常, 必須要以多型概括⼦類別的異常 改寫,選擇性使⽤ throws 定義原⽅法可能拋出的 RuntimeException

留言