异常
为什么要引入异常?
因为在程序运行的时候,可能会出现数组溢出、文件不存在、除数为0,空指针等异常
常规处理
采用if else 如果有多种异常,就用多个if else嵌套
弊端:实际上只有部分真正执行的代码,其余的都是if-else 判空等操作没有实际意义,导致代码臃肿,出异常的时候要不断调试找出bug的地方。
引入异常
Java提供了异常处理的机制。它可以把异常处理代码和业务代码分离,程序具有好的可读性、容错性和健壮性
异常处理
1、try-catch
2、finally
3、throw
4、throws
使用方式
try-catch
语法:
try{
可能发生异常的代码块
}catch(){
异常的处理
}finally{
通常用于资源释放
}
• 情况1:try块中代码没有出现异常
• 不执行catch块代码,执行catch块后边的代码
• 情况2:try块中代码出现异常,catch中异常类型匹配(相同或者父类)
• 执行catch块代码,执行catch块后边的代码
• 情况3:try块中代码出现异常, catch中异常类型不匹配
• 不执行catch块代码,不执行catch块后边的代码,程序会中断运行
• 注意
• 出现异常后,Java会生成相应的异常对象,Java系统,寻找匹配的catch块,找到后将异常对象付给catch块异常参数
• 出现异常后,try块中尚未执行的语句不会执行
• 出现异常后并处理后,catch块后面的语句还会执行
try-catch-finally
在try-catch块后加入finally块,可以确保无论是否发生异常,finally块中的代码总能被执行
通常在finally中关闭程序块已打开的资源,比如:文件流、释放数据库连接等。
但是并不是finally的代码块一定能被执行,当程序出现System.exit(1)提前退出虚拟机,finally将不被执行
Finally块的具体执行过程
• 执行try或catch中代码
• 遇到return/throw,先执行finally中语句块
• 执行return/throw
多个异常的处理
采用多重catch捕获多种类型的异常,一般执行过程是:
1、当引发异常时,会按顺序来查看每个 catch 语句,并执行第一个与异常类型匹配的catch语句
2、执行其中一条 catch 语句后,其后 catch 语句将被忽略
3、在安排catch语句的顺序时,首先应该捕获最特殊的异常, 然后再逐渐一般化,即先子类后父类
@Test
void testExcep</