java 异常有哪些分类呢?
一:异常体系分类
对上图进行简要介绍:
最大的异常为Throwable,该异常分为两种类型异常:Error(系统级异常,程序不能处理)、Exception(程序可以处理的异常)
Error:最常见的异常是OOM
Exception:分为受检查的异常和不受检查的异常
① 受检查的异常需要程序处理
②不受检查的异常,可处理也可不处理,例如空指针异常、类型转换异常
二:java中与异常处理相关的5个关键字
try: try{}代码块中放可能产生异常的代码
catch: catch(Exception ex){}代码块中放处理异常的代码
finally:finally{}代码块中放一定会被执行的代码
throw:throw用在代码中手工抛出异常
throws:throws用在方法的声明部分,表示此方法会抛出异常
1: try和catch
try后面跟一个代码块,将可能产生异常的代码放在这个代码块里
catch处理异常的代码,catch后的小括号中必须定义一个异常类型的引用,用来接收try块抛出的异常对象。Try代码块产生异常时,异常信息被封装到某个类型的异常对象中,对象被传递给catch后面小括号中定义的异常类型的引用
程序结构:
Try,catch的3种情况:
第1种:try块没有产生异常,try块里的代码执行完毕,不会进catch, 接着执行try,catch后面的其它代码
第2种:try块产生异常,并且产生的异常被正确的捕获到了,直接从产生异常的代码进入catch(产生异常的代码后的其它代码不会执行),catch块里的代码执行完毕后,接着执行try,catch后面的其它代码
第3种:try块产生异常,并且产生的异常没有被正确的捕获到了,程序执行直接中断,和没有对异常进行处理是一样的
另外:假如try代码块里的代码可能产生多种异常,此时1个try对应多个catch
执行过程:
将产生的异常跟第1个catch里的异常类型进行比较,
假如异常类型匹配,进入这个catch代码块,catch代码块执行完毕,忽略其它的catch块,接下去执行try,catch块后的其它代码
假如不匹配,与下一个catch进行比较,直到找到匹配的,则进入匹配的catch块,catch代码块执行完毕,忽略其它的catch块,假如都不匹配,程序中断,相当于没有对异常进行处理
当要捕获的多个异常存在父子关系的时候,子类在前,父类在后,否则会产生不可达的代码,编译报错;假如不存在父子关系,无所谓先后。
2: finally
finally代码块
无论前面的try…catch是3种情况下的哪一种,finally里面一定会被执行到
finally代码块中通常写释放资源的代码
程序结构:
try{
//可能产生异常的代码
}catch(Exception ex){
//处理异常的代码
}finally{
//一定会被执行的代码
}
try后面可以只跟catch(可以有多个), 也可以只跟finally(1个),也可以二者都有
3: throw,throws
throw: 用在代码中手工抛出异常
语法:throw new 异常类();
throws: 用在方法的声明部分,告诉调用者此方法会抛出异常
抛异常的方法:
方法的调用者:
方法的调用者有2个选择:
- 处理异常
- 将异常继续向外抛出,假如已经是main方法,建议不要再向外抛
4:自定义异常
继承Exception或者RuntimeExcepion, 实现空参构造和全参构造