异常:在运行时期发生的不正常。
(异常处理代码)和(正常逻辑代码)分离。将问题封装为对象抛出。
异常体系:
Throwable
Error 不可处理的 有jvm抛出的严重问题 子类不是
Exception 可以处理的
编译时被检测异常 Exception和其子类 不处理就编译失败
希望在编译时就处理的异常,这种问题都有对应的处理方式。
继承Exception
运行时被检测异常 RuntimeException和其子类 编译器不检查,不处理不会编译失败
RuntimeException不用被抛出(抛出也没用,处理不了),一旦出现,程序停止运行。
这种问题一旦发生,功能无法继续,更多是由调用者的原因导致的。
所以不做处理,在运行时让程序直接停止,让调用者调整代码。
继承RuntimeException
RuntimeException和Error
RuntimeException是在正常运行时出现的,Error是无法让程序正常运行。
创建异常类:
当一个异常情况只有在自己的项目中才会出现(特有情况)。就使用异常描述。
继承异常类(Exception或者RuntimeException),定义空参构造函数,使用super(s)定义有参构造函数。
处理异常:
能处理就处理,不能处理就抛出,交给调用者处理。
try{}catch(异常类 变量){}finally{}
上面这个变量用于接收发生的异常,和形参类似
catch用于处理异常情况。
try{}catch(异常类1 变量){}catch(异常类2 变量){}finally{}
按顺序catch,一定要把子类异常写在前面,父类的放在后面。
抛出:
Throws关键字:
声明抛出异常。
Throws 异常类,异常类2...;
Throw关键字:
Throw 异常对象;
将异常实例抛出给调用者。
在catch中抛出
try{}catch(异常类1 变量){Throw 异常对象}finally{}
这里抛出异常也是一种处理方式。抛出的异常可使用调用者熟悉的另一种异常。
继承与异常:
1:父类抛出了异常,则子类也需要抛出(抛出的异常可以是父类的异常,也可以是其子类)
2:父类抛出多个异常,则子类抛出异常的子集。
3:父类没有抛出异常,则子类不能抛异常。