自定義異常


估計他們上完課就再也不玩了,自己那段時間上完課。也就基本上很少來了,主要是 沒有什么記錄的習慣,奇怪的是,每每到了心情不好的時候,總會想要寫點什么。

 

不管怎么樣還是出去花錢學習了一下,這段經歷。嗯,很難評價,事實上如果不留下一筆,那么的確沒有什么學習的意義。

 

所以,李飛要一點兒一點兒扳過來。

 

出去學習以后發現一個事兒,那就是我真的沒有很聰明,接受知識,可能也沒我自詡的那么快,記憶力也沒那么好。所以要想成長,我真的要做的就是,勤奮,更加勤奮才行。

 

這天是袁海鵬老師授課。印象中10.13,因為是10.12走的。

 

今天講授的是自定義異常。

 

自定義異常的步驟:

1、創建一個類。繼承exception或者 runtimeException。

2、構造函數的書寫。

3、非法狀態下創建該類的對象。

示例1:

package ExceptionPart;

public class SelfDefinitionException extends Exception {
    
    public SelfDefinitionException(String message){
        super(message);
    }
    
    public static void main(String[] args) throws SelfDefinitionException{
        throw new SelfDefinitionException("lifei");
    }
    
}

 

 

運行結果:

Exception in thread "main" ExceptionPart.SelfDefinitionException: lifei
at ExceptionPart.SelfDefinitionException.main(SelfDefinitionException.java:10)

 

這樣好像沒什么意思。什么也有沒有做一樣,事實上,如果單獨看這個東西,確實什么也不是。這樣需要考慮自定義異常是用來干什么的?就是遇到了問題,然后擲出問題。避免一些不合法的狀況發生。把一些在編譯環境下允許的東西以異常的形式報告給開發人員,從而更好地解決當前問題。

比如,我們往數據庫的年齡字段存儲負數或值過大的數的時候,可能會在某一個未知的環節出錯。如果我們在開始填入的時候就規定了這個數的值域的話,那么后期維護的成本就會很低。

所以合理的邏輯是,如果某個數值不合乎要求,那么就會出現異常。所以。我們不需要再主函數中直接報出異常。給一個條件。

if(年齡不合理){

  throw new AgeException("年齡不合理");

}

按照這個邏輯的話:

public class AgeException extends Exception {
  public AgeException(){
    super("年齡不合理異常");
  }
}

 

所以示例2:

package ExceptionPart;

//年齡異常處理類
public class AgeException extends Exception {
    //構造函數
    public AgeException(){
        //重寫
        super("年齡不合理異常");
    }
}

 

package ExceptionPart;
public class AgeExceptionTest {    
    public static void main(String[] args) throws AgeException {
        //設置
        int age = -5;
        //檢測
        if(age>150||age<0){
            throw new AgeException();
        }//【后來標記 ,第9行】
        //輸出
        System.out.println("my age is "+age);
    }
}

運行結果:

Exception in thread "main" ExceptionPart.AgeException: 年齡不合理異常
at ExceptionPart.AgeExceptionTest.main(AgeExceptionTest.java:9)

 

練習:

創建一個關於性別的自定義異常類,男女是合法的。

package ExceptionPart;

public class GenderException extends Exception {
    
    public GenderException() {
        super("輸入的性別不符合規范");
    }
    public GenderException(String message){
        super(message);
    }

}
package ExceptionPart;

public class GenderExceptionTest {
    public static void main(String[] args) throws GenderException {
        String gender = "s";
        if(!"男".equals(gender)&&!"女".equals(gender)){
            throw new GenderException("性別的輸入不符合規范");
        }
        System.out.println("小明的性別是:"+gender);
    }
}

 

 

 

問題:

出了一個這樣的問題:並不知道 怎么解決。

希望和小伙伴們一起探討一下:

問題來源:期望寫一個當前類的重載函數。然后根據年齡的數值來決定調用 使用哪一個語句進行輸出。

但是出現了這樣一個異常。

package ExceptionPart;

public class AgeException1 extends Exception{
    private final String NATIVETIPS = "當前年齡為負數";
    private final String BIGTIPS = "當前年齡過大";
    private static String result = "您的年齡不合法";
    public AgeException1(int age){
        
        if(age<0){
            result=NATIVETIPS;
        }
        else if(age>150){
            result = BIGTIPS;
        }
        System.out.println(age);
        System.out.println(result);
        super(result);//這里編譯器 會報錯
    }
    public AgeException1(){
        super(result);
    }
}

更改方式:

package ExceptionPart;

public class AgeException1 extends Exception{
    private final String NATIVETIPS = "當前年齡為負數";
    private final String BIGTIPS = "當前年齡過大";
    private static String result = "您的年齡不合法";
    public AgeException1(int age){
        super(result);//挪到這里就沒有問題。
        if(age<0){
            result=NATIVETIPS;
        }
        else if(age>150){
            result = BIGTIPS;
        }
        System.out.println(age);
        System.out.println(result);
        //把剛剛那句話拿上去,就沒有問題
    }
    public AgeException1(){
        super(result);
    }
}

然后報的編譯錯誤是:

Constructor call must be the first statement in a constructor

猜想這句話應該翻譯為:構造函數的調用必須在一個構造函數中優先(首先)聲明。

當前類在創建的時候,優先調用父類的構造函數。所以不寫的話,就算了,寫就只能出現在第一行。然后優先調用。不寫的話,就優先,並且默認調用。

 

 

如有問題歡迎探討和斧正。BY Letben。

 

6、自定義異常步驟:

(1)創建異常類,繼承Exception 或者 RuntimeException

(2)在異常類中定義構造方法,實現方法體

示例:public class AgeException()extends Exception{}

Public AgeException(String message){

Super(message);

}

(3) 拋出異常時,創建一個 異常類對象

示例:throw new AgeException(“年齡異常”);

 

練習:使用自定義異常實現對男女性別的驗證。

 

接口優化:

方式:(1)先定義接口,然后讓類直接實現

2)先定義接口,然后定義實現類,如果哪個類需要對應的方法,則創建對應的實現類對象(使用接口實現多態)

選擇依據:(1)如果實現的方法不是所有子類都擁有

2

 

 

補充:instanceof關鍵字:

語法:對象名 instanceof 類名/接口名

注:如果對象名和接口有關系,即該對象所屬類實現了該接口,表示兩者有關系。如果存在關系,則該對象可以強轉成對應接口

示例:Animal cat= new Cat();//cat類和LegDao有關系

LegDao dao = LegDaocat//對象可以轉換成LegDao

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM