异常的概念和体系
1.1 概念
在Java中,将程序执行过程发生的不正常行为称为异常
如:1.算数异常 2.数组越界异常 3.空指针异常
Java中不同的异常,都有其对应的类来描述
1.2体系结构
![](https://img-blog.csdnimg.cn/img_convert/8b4c0a44790e50994ab68a7c31bfbc48.png)
Throwable:异常体系的顶层类,派生出两子类 Error 和Exception
Error:Java虚拟机无法解决的严重问题,如:JVM的内部错误,资源耗尽等
Exception:产生后可以通过代码解决,使程序继续执行
1.3分类
编译时异常
程序编译时发生的异常,也叫受查异常
运行时异常
程序执行时发生的异常,也叫非受查异常
RunTimeException以及其子类对应的异常,都称为运行时异常
异常地处理
2.1防御式编程
LBYL:事前防御型
代码混乱
EAFP:事后认错型
try{
...
}catch(...){
...
}
Java异常处理五个关键字:throw、try、catch、final、throws
2.2异常的抛出
throw new XXXException("异常产生的原因");
throw必须写在方法体的内部
抛出的对象必须是Exception或者是Exception的子类
如果抛出的是RunTimeException或者是其子类,可以不处理交给JVM来处理
异常一旦抛出,其后的代码便不会执行
2.3 异常的捕获
两种方式:
异常声明:throws
try-catch处理
2.3.1 异常声明throws
语法格式:
修饰符 返回值类型 方法名(参数列表) throws异常1,异常2...{
}
可以找出具体的异常尽量不要写Exception
如果抛出了多个异常,throws后面必须跟多个异常类型,之间逗号隔开
声明的异常必须是Exception或者是Exception的子类
调用抛出异常的方法时,调用者必须对该异常进行处理,或者继续用throws抛出
2.3.2 try-catch捕获并处理
throws只是抛出了异常,并未对异常进行处理,调用throws方法时得要对异常进行处理,这时就需要用到try-catch
语法格式
try{
//将要出现的异常的代码放这里
}catch(要捕获的异常类型 e){
//如果try中的代码出现异常了,并且符合catch括号内的异常或者是其子类,便会执行catch中的代码
}catch(要捕获的异常类型 e){
//
}
//一般最好写成子类在上,父类在其下的形式
finally{
//这里面的代码无论如何都会被执行
}
[注意]:
try块内抛出异常以后的代码将不会被执行
如果异常没有被catch捕捉,那么catch内的代码也将不会被执行,直到JVM收到后中断程序
try中可能会出现多种异常,那么就需要多个catch来进行捕捉
如果多个异常的处理方式完全相同,也可以写成
catch(XXXException | XXXException e){
...
}
2.3.3 finally
无论程序是否发生异常,都必须执行的代码
如:资源关闭、资源回收时使用
【注意】:如果finally中存在return,那么将不会执行try中的return而是会执行finally中的
2.4 异常的处理流程
当方法出现异常时,我们可以使用e.printStackTrace()的方式查看出现异常代码的调用栈
![](https://img-blog.csdnimg.cn/img_convert/22bc9a59b48222076d9a01540bb88495.png)
如果没有合适的方法来处理异常,最终还是会交给JVM来处理
[异常处理流程]:
程序先执行try中的代码
如果try中的代码出现异常,就会结束try中的代码,看catch中的异常类型是否匹配出现的异常
如果找到匹配的异常类型,就会执行catch中的代码
如果没有找到匹配的异常类型,就会将异常向上传递到上层调用者
无论是否找到匹配的异常类型,finally中的代码都会被执行到(方法结束之前执行
如果上层调用者也没有处理得了的异常,就会继续向上传递
一直到main方法也没有合适的代码处理异常,就会交给JVM处理,程序异常终止
3.自定义异常类
具体方式:
自定义异常类,然后继承Exception或者RunTImeException
实现一个带有String类型参数的构造方法,参数意义:出现异常的原因
class XXXException(自定义异常) extends Exception{
//写构造方法
public XXXException(String message){
super(message);
}
}
[注意]:
自定义异常通常会继承于Exception或者RunTimeException
继承自Exception的默认为受查异常
继承自RunTimeException的默认为非受查异常