估計他們上完課就再也不玩了,自己那段時間上完課。也就基本上很少來了,主要是 沒有什麼記錄的習慣,奇怪的是,每每到了心情不好的時候,總會想要寫點什麼。 不管怎麼樣還是出去花錢學習了一下,這段經歷。嗯,很難評價,事實上如果不留下一筆,那麼的確沒有什麼學習的意義。 所以,李飛要一點兒一點兒扳過來。 出去學
估計他們上完課就再也不玩了,自己那段時間上完課。也就基本上很少來了,主要是 沒有什麼記錄的習慣,奇怪的是,每每到了心情不好的時候,總會想要寫點什麼。
不管怎麼樣還是出去花錢學習了一下,這段經歷。嗯,很難評價,事實上如果不留下一筆,那麼的確沒有什麼學習的意義。
所以,李飛要一點兒一點兒扳過來。
出去學習以後發現一個事兒,那就是我真的沒有很聰明,接受知識,可能也沒我自詡的那麼快,記憶力也沒那麼好。所以要想成長,我真的要做的就是,勤奮,更加勤奮才行。
這天是袁海鵬老師授課。印象中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。