1、理清异常处理的思路:
所有的异常继承于:Throwable:这个体系的特点:体系中的所有类,以及对象都具备可抛性。
Throwable有两个直接子类:Error,Exception
Throws用来声明问题。
throw用抛出问题对象。
try...catch...进行异常捕获处理。
2、 为什么要自定义异常?
有很多异常的子类继承了Throwable,来描述常用见的异常,但是在实例开发的时候我们会遇到一些Java类库中没有描述的异常,这时候就需要我们自定义异常来处理程序中的异常;
我们可以模仿已经在类库中描述的异常处理的类来自定义异常,首先查AFI文档,发现Error、Exception各有四个构造方法,没有直接方法,所以我们在定义异常的时候只要继承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("换个老师讲课!");//异常处理方法
}
}
}
如有错漏,诚恳求证!