Java高階語法筆記-自定義異常類
阿新 • • 發佈:2019-01-28
自定義異常類
繼承Exception,自定義異常類: 異常類要能夠描述錯誤資訊
比如,非法字元異常 IllegalCharException應該把非法字元的位置帶上。
throws多種異常
throws用於宣告本函式可能產生的異常的種類
void parse(String s) throws IllegalCharException,BadFromatException{
}
各異常類以逗號分隔
異常的匹配
根據丟擲的異常物件的型別,從前往後匹配catch語句。
- 若匹配成功,則其他的catch不再匹配.
- 若全不匹配,則繼承向上層函式丟擲。
異常的匹配
怎麼才算是匹配成功?假設丟擲的物件型別為EA
catch(EX e)
{
}
如果EA與EX型別相同,或是EX的子類,則匹配成功.怎麼抓獲所有型別的異常?
catch( Exception e)
{
}
HelloWorld.java
IllegalCharException.java
執行結果如下:
繼承Exception,自定義異常類: 異常類要能夠描述錯誤資訊
比如,非法字元異常 IllegalCharException應該把非法字元的位置帶上。
throws多種異常
throws用於宣告本函式可能產生的異常的種類
void parse(String s) throws IllegalCharException,BadFromatException{
}
各異常類以逗號分隔
異常的匹配
根據丟擲的異常物件的型別,從前往後匹配catch語句。
- 若匹配成功,則其他的catch不再匹配.
- 若全不匹配,則繼承向上層函式丟擲。
異常的匹配
怎麼才算是匹配成功?假設丟擲的物件型別為EA
catch(EX e)
{
}
如果EA與EX型別相同,或是EX的子類,則匹配成功.怎麼抓獲所有型別的異常?
catch( Exception e)
{
}
由於Exception類是所有異常的父類,所以用這個肯定能捕獲異常。(相當於default處理)
程式碼如下:
BadFormatException.java
BadRangeException.javapackage my; public class BadFormatException extends Exception { String reason; public BadFormatException(String reason) { this.reason=reason; } @Override public String getMessage() { return "格式錯誤("+reason+")"; } }
package my;
public class BadRangeException extends Exception
{
String reason;
public BadRangeException(String reason) {
this.reason=reason;
}
@Override
public String getMessage()
{
return "範圍錯誤("+reason+")";
}
}
Date.java
package my; public class Date { public int year,month,day; public void parse(String dateStr) throws IllegalCharException,BadFormatException,BadRangeException { //檢測非法字元 for(int i=0;i<dateStr.length();i++) { char ch=dateStr.charAt(i); if(ch>='0'&&ch<='9') ; else if(ch=='-'); else throw new IllegalCharException(i); } //檢測分割符 int p1=dateStr.indexOf("-"); if(p1<0) throw new BadFormatException("找不到第1個橫槓!"); int p2=dateStr.indexOf("-",p1+1); if(p2<0) throw new BadFormatException("找不到第2個橫槓!"); //檢測年月日的長度 String s1=dateStr.substring(0, p1); String s2=dateStr.substring(p1+1, p2); String s3=dateStr.substring(p2+1); if(s1.length()!=4) throw new BadFormatException("格式不對:年份錯誤!"); if(s2.length()!=1&&s2.length()!=2) throw new BadFormatException("格式不對:月份錯誤!"); if(s3.length()!=1&&s3.length()!=2) throw new BadFormatException("格式不對:日份錯誤!"); this.year=Integer.valueOf(s1); this.month=Integer.valueOf(s2); this.day=Integer.valueOf(s3); //有效性檢測 if(month<0||month>12) throw new BadRangeException("資料無效:月份不能為"+month); if(day<0||day>31) throw new BadRangeException("資料無效:日期不能為"+day); } @Override public String toString() { return year+"年"+month+"月"+day+"日"; } }
HelloWorld.java
package my;
public class HelloWorld
{
public static void main(String[] args)
{
Date d=new Date();
try {
d.parse("2016B-12-1");
System.out.println("日期為:"+d.toString());
}catch(IllegalCharException e) {
System.out.println(e.getMessage());
}
catch(BadFormatException e) {
System.out.println(e.getMessage());
}
catch(BadRangeException e) {
System.out.println(e.getMessage());
}
catch(Exception e) {
}
}
}
IllegalCharException.java
package my;
public class IllegalCharException extends Exception
{
int position=0;
public IllegalCharException(int pos) {
this.position=pos;
}
@Override
public String getMessage()
{
return "非法字元("+position+")";
}
public int getPosition() {
return position;
}
}
執行結果如下: