1. 程式人生 > >Java高階語法筆記-自定義異常類

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

package my;

public class BadFormatException extends Exception
{
	String reason;
	public BadFormatException(String reason) {
		this.reason=reason;
	}
	@Override
	public String getMessage()
	{
		return "格式錯誤("+reason+")";
	}
}
BadRangeException.java
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;
	}
}

執行結果如下: