黑马程序员_复习异常:理解自定义异常

---------------------- 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章