【异常 Exception】
【概念】
表示程序运行时发生的可能会导致程序异常中断的错误
【异常的分类】
Throwable:表示java程序运行过程中发生的一切不正常事件
Error 错误:JVM内部发生的严重错误,一旦发生,程序不可能回到正常指令流程
如 java.lang.StackOverflowError 栈溢出
java.lang.OutOfMemoryError 堆溢出(OOM)
Exception 异常:运行时发生的一般错误,经过合适的处理后,还是可以回归正常的指令流程.
所有的runtimeexception类及其子类的实例被称为runtime异常,其余的异常被称为受查异常
RuntimeException: 运行时异常,由于程序员逻辑不严谨导致,非受察异常,不强制要求处理
如空指针异常,数组下标越界异常,算数异常,强制类型转换异常
非RuntimeException: 非运行时异常, (checked)受察异常,往往是由于外部偶然因素导致,这类异常编译器强制要求你处理
Checkedexception: IOException,FileNotFoundException
【异常的处理方式】
1. 捕获
1)
try {
// 可能会发生异常的代码
} catch (异常的类型 变量名){
// 对异常的处理
}
2)
try{
} catch(异常类型1 e){
} catch(异常类型2 e){
} ... catch (Exception e){
}
* 注意:如果有父子关系,要把父类写在后面
3)
try{
// 有可能会发生异常的代码块
}catch(){
// 捕获到了异常之后,用来处理异常的代码块
// 不允许出现有异常隐患的代码
}finally{
// 无论有没有发生异常,都会执行的代码块
// 不允许出现有异常隐患的代码
}
4)最常用的
try{
} finally{
}
2. 抛出
A让B做一件事,但是这件事情有风险,可能会损失100块钱。
如果发生了这个问题,B选择自己掏钱,叫做捕获
如果B自己不掏钱,那么A就要掏出100块钱处理异常,这叫做抛出(B把异常抛给了A)
throw:
抛出一个异常对象(语句)
throws:
声明该方法可能会抛出一个异常(声明)
如果声明的是抛出非运行时异常,那么调用此方法的地方就必须要处理这个异常
如果声明的是抛出运行时异常,就相当于没写
* 注意:声明会抛出异常的方法,有可能会抛出异常
也有可能不抛出异常
【自定义异常】
往往会把发生不同原因的异常划分为不同的类型,
在java API中已经有很多异常类型了
但是有时候还是不足以解决实际开发中遇到的异常
比如给一个学生设置年龄的时候,设置 -5岁 就显然是一种异常
1. 自定义异常:
自己写一个异常类型,然后继承于Exception或RuntimeException
2. 好处:
给不同原因导致的异常分成不同的类型,便于管理和解决。
【总结】
1. 运行时异常,不允许使用try-catch,在前面加上if判断解决
2. 非运行时异常,要么捕获,那么抛出
3. 底层/业务逻辑层的所有异常,全部抛出
4. 异常的捕捉,如果不太关心具体是什么异常,可以直接使用Exception捕捉即可,而要区别是什么异常,则需要指定具体的异常类来进行捕捉。
应用:https://blog.csdn.net/qq_36194262/article/details/82735259