持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,[点击查看活动详情]
异常体系
异常:程序在编译或运行的过程中出现的一些错误。
异常体系内的最终父类是:Throwable,当对象是此类的实例时,才能通过java虚拟机,java throw语句抛出。
Throwable->Error 严重性的问题,一般由java虚拟机直接抛出,主要是内存上的一些问题(是不能直接控制的)
Throwable->Exception 一般性的问题,可以由java虚拟机或throw抛出.
堆是为了存对象。OutofheapError堆内存溢出(堆中没有空间去创建对象);StackOverFlowError栈内存溢出(栈内没有空间去进(压)栈函数),递归。
Throwable:可抛出的,throw new XxxxException();
JVM抛出的问题可能是Error问题,或者没有处理的问题。抛出的都是已经存在的异常体系中的对象。
throw抛出问题是可控的问题。
JAVA异常:自定义异常。只能手动抛出。
Exception->RuntimeException:运行时异常。在程序运行期间出现的错误,编译时检测不到。
Exception->Exception及其他子类:编译时异常。在编译期间被检测出来的可能会发生的错误。
解决问题
声明
对运行时异常无效果。
在当前异常发生的函数后面加 throws 异常类名。
作用:预先告诉调用者(准备调用函数的)问题,但没有真正解决。
对于调用者也有两种解决方案:声明、捕获。
void main() throws XxxxException{
show();
}
void show() throws XxxxException{
throw new XxxxException();//编译时异常
}
throws:后是类。throw:后是异常对象。
捕获
编译时异常,运行时异常都可
在当前异常发生的地点直接将异常处理掉。
void show() {
try{ //尝试着去执行某些代码
throw new XxxxException();//编译时异常||运行时异常
}catch(XxxxException e){ //一旦try中出现异常则catch将其捕获
//e=new XxxxException();e:异常的引用变量
//进行修改
}finally{ //无论是否异常发生,都要去执行的代码。
}
}
如果手动的将异常throw之后的代码就不可执行。
在IO,数据库连接,网络编程的时候使用“finally”,都会占用内存资源,如果用完之后不释放资源,会导致内存浪费。
异常转换
每一个层级都有要去考虑不同的结果。
第一层出现异常A,导致第二层出现异常B.\
在继承中使用异常的情况
编译时异常
1,父类的函数如果没有声明任何编译时异常,那么子类重写的函数也不能声明。就算子类当中出现了编译时异常,也只能进行捕获,不能声明。
2, 父类的函数如果声明了编译异常,那么子类重写的函数只能声明该异常或该异常的子类的子集。
3,父类的函数如果声明了多个编译时异常,那么子类重写的函数只能声明这些异常或其子类的子集。