一、异常概念
1、异常:在运行时期发生的不正常的情况。
2、异常类:描述不正常的类
3、将各个异常类的共性向上抽取,形成异常体系。
4、最终不正常的情况就分为两个类。
5、一个超类Throwable,下面有两个子类Error、Exception,每个子类下面还有很多子类。(一个爷爷,有两个儿子,每个儿子还有许多小孩。)
6、Throwable(可抛性):将问题抛出让调用者知道并处理。凡是throw/throws关键字可以操作的类或对象就具有可抛性。
7、Error(一般不可处理) 和 Exception(可以处理的)。(Error:由jvm抛出的严重性问题,一般不针对性修改,直接修改程序。)
二、异常的分类
Java编译器先检查语法错误,再进行异常等问题检测。
1、编译时异常(可查异常):Exception中的子类(除去RuntimeException体系);
这种问题希望在编译时进行检测,进行对应的处理方式(必须使用try-catch捕获或者throws抛出)。
2、运行时异常(不可查异常之一):RuntimeException和其子类。
这种问题无法让功能进行继续,这种问题编译器不会检查,运行时让调用者调用程序强制停止,让调用者修改程序。不需要throws进行声明。也不需要捕获,但是可以进行捕获。
总体来说,Java规定:允许忽略不可查的RuntimeException和Error。
三、自定义异常
1、创建自定义异常类。
2、在方法中通过throw关键字抛出异常对象。
3、如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理;否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作。
4、在出现异常方法的调用者中捕获并处理异常。
四、异常捕获
1、try catch(多个) finally
try
{
//待检测部分
}
catch(创建异常类对象)//多个catch的情况,首先从第一个匹配,若匹配成功一个,其他不再匹配,直接跳出。
{
//对异常进行处理
}
catch(创建异常类对象)
{
//对异常进行处理
}
………….多个catch
finally //通常用于关闭(释放)资源。
{
//一定要执行的
//就算catch里面有return也会执行;但是当有System.exit(0);会退出虚拟机,不会执行了。
}
2、try finally
异常不处理,用于资源关闭。
五、异常转换与继承注意
1、将一个内部异常转化为对方可以理解的异常。也可以叫做异常封装,对外不暴露出内部的异常,转换出外面可以处理的异常。
2、子类覆盖父类只能抛出父类异常或者子类或者子集。如果父类的方法没有抛出异常,子类一定不能抛,只能try。