黑馬程序員_複習異常:理解自定義異常

---------------------- android培訓 、 java培訓 、 期待與您交流! ----------------------

       

1、理清異常處理的思路:

        所有的異常繼承於:Throwable:這個體系的特點:體系中的所有類,以及對象都具備可拋性。

       Throwable有兩個直接子類:ErrorException

        Throws用來聲明問題。

       throw用拋出問題對象。

        try...catch...進行異常捕獲處理。


2、 爲什麼要自定義異常?

       有很多異常的子類繼承了Throwable,來描述常用見的異常,但是在實例開發的時候我們會遇到一些Java類庫中沒有描述的異常,這時候就需要我們自定義異常來處理程序中的異常;

       我們可以模仿已經在類庫中描述的異常處理的類來自定義異常,首先查AFI文檔,發現ErrorException各有四個構造方法,沒有直接方法,所以我們在定義異常的時候只要繼承Error、Exception覆蓋其構造方法就能達到自定義異常的效果。用兩個繼承Exceptin的例子說明:

class FuShuException extends Exception//自定義異常,繼承Exception
{
    private int num;
    FuShuException()//覆蓋空參構造方法
    {
        super();
    }
    FuShuException(String meg,int num)//覆蓋傳參構造方法
    {
        super(meg);//訪問父類中的有參構造函數

        this.num = num;
    }
    public int getNum()
    {
        return num;
    }
}
class Demo
{
    int div(int a,int b)throws FuShuException/*聲明自定義的異常*/,ArithmeticException
    {
        if(b<0)
            throw new FuShuException("負數啦,又廢啦!",b);//拋出自定義異常

        return a/b;//throw new ArithmeticException();
    }
}
class ExceptionDemo4
{
    public static void main(String[] args)
    {
        Demo d = new Demo();
        try
        {
            int num = d.div(4,0);
            System.out.println("num="+num);
        }
        catch (FuShuException e)//用try...catch...捕獲自定義異常
        {
            System.out.println(e.toString()+e.getNum());
        }
        catch (ArithmeticException e)
        {
            System.out.println(e.toString()+".....");
        }
        System.out.println("over");
    }
}

3、 演示使用自定義異常處理實際開發中的問題:

/*
自定義老師上課時可能出現的異常,以及異常的處理;
以及自定義公司老師上課計劃異常,以及異常處理方案
*/
class LanPingException extends Exception//電腦可能出現藍屏異常
{
	LanPingException(String msg)
	{
		super(msg);
	}
}
class MaoYanException extends Exception//電腦可能出現冒煙異常
{
	MaoYanException(String msg)
	{
		super(msg);
	}
}
class NoPlanException extends Exception//老師計劃可能有變,無法完成教學計劃
{
	NoPlanException(String msg)
	{
		super(msg);
	}
}
class Computer
{
	/*
	假設三種狀態:state==0、state==1、state==2;
	0---電腦正常運行、1---電腦藍屏、2---電腦冒煙
	*/
	int state=0;
	void run()throws LanPingException,MaoYanException//聲明兩個異常
	{
		if(state==1)//當電腦狀態爲1時,電腦是藍屏狀態
			throw new LanPingException("藍屏啦!");//拋出藍屏異常

		if(state==2)//當電腦狀態爲2時,電腦是冒煙狀態
			throw new MaoYanException("冒煙啦,廢啦!");//拋出冒煙異常

		System.out.println("電腦運行!");//電腦正常運行狀態
	}
	void reset()//電腦重啓函數
	{
		System.out.println("電腦重啓!");
		state=0;//電腦重啓後,改變電腦狀態
	}
}
class Teacher
{
	private String name;
	private Computer cmpt;
	Teacher(String name)
	{
		this.name=name;
		cmpt=new Computer();
	}
	public void prelect()throws NoPlanException//異常轉換,拋出一個與教學任務有關的異常
	{
		/*
		對異常進行環繞處理
		*/
		try
		{
			cmpt.run();
			System.out.println("講課!");
		}
		catch (LanPingException e)//對拋出藍屏異常進行接收
		{
			System.out.println(e);
			cmpt.reset();//處理藍屏異常,重啓電腦
			prelect();//電腦重啓後,狀態恢復正常,繼續講課!
		}
		catch (MaoYanException e)//對拋出冒煙異常進行接收
		{
			System.out.println(e);
			test();
			/*MaoYanException e=new MaoYanException();*/
			//throw e;//將解決不了的問題繼續拋出。
			/*考慮到實際開發中是不應該拋出調用者無法解決的異常,此時應對異常進行轉換*/
			
			throw new NoPlanException("課時進度無法繼續!");//拋出與教學任務有關的異常
		}
	}
	public void test()//老師處理異常的方法
	{
		System.out.println("做練習!");
	}
}
class ExceptionDemo2 
{
	public static void main(String[] args) 
	{
		Teacher t=new Teacher("老畢");

		try//公司對老師拋出的教務計劃異常的環繞處理
		{
			t.prelect();
		}
		catch (NoPlanException e)//異常接收
		{
			System.out.println(e);
			System.out.println("換個老師講課!");//異常處理方法
		}	
	}
}

如有錯漏,誠懇求證!


---------------------- android培訓 、 java培訓 、 期待與您交流! ----------------------
詳細請查看:www.itheima.com
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章