异常是什么?
异常是程序运行时出现错误之后的一种通知机制
Java中的异常有很多种,针对不同种类的异常,可以有不同的处理方式
如果在代码中不做任何处理,此时异常就会交给JVM来处理,JVM一般处理的方式就是把程序直接强行终止
异常的应用场景 -> 防御式编程
LBYL: Look Before You Leap 三思而后行 先进行合法校验,校验通过,再进行实际操作
EAFP(推荐): It’s Easier to Ask for Forgiveness than Permission 事后获取原谅比事先获取更容易
EAFP风格:核心语法支持就是异常机制
出现异常之后一些典型处理方式(catch 中应该写什么)
1. 直接让程序结束:对于致命问题
2. 打印日志:对于普通问题,可以记录一下出现问题的原因/代码位置(.printStackTrace())
3. 给程序员发送报警短信/微信/电话
Java异常体系
1. 最顶层的父类 Throwable 派生出Error(JVM使用) Exception(程序员使用)
2. 当前看到的这一大堆异常类分成两个阵营
a) Error 和 Runtime Exception 构成了一个阵营,非受查异常
b)除了上面剩下的,都是受查异常
{ 当代码可能出现受查异常的时候,必须在代码中显示处理
具体处理方式有两种
a)使用 try catch 当场就处理
b)使用throws把异常交给方法调用者处理(把锅甩给调用者处理了,调用者还得try catch 或者 throws 多个受查异常 。可以使用throws 声明多个类型,多给类型之间使用","分割)}
异常处理流程
1. 程序先执行try中的代码
2. 如果try中的代码出现异常,就会结束try中的代码,看和catch中的异常类型是否匹配
3. 如果找到匹配的异常类型,就会执行catch中的代码
4. 如果没有找到匹配的异常类型,就会将异常向上传递到上层调用者
5. 无论是否找到异常的匹配类型,finally中的代码都会被执行到(该方法结束之前执行)
如果上层调用者也没有处理异常,就会继续向上传递,一直到main方法也没有合适的代码处理异常,就会交给JVM来进行处理,此时程序就会异常终止
自定义异常类
创建出来的异常类其实没啥实质性的代码
创建出来的本质目的时为了增加一些异常的类型 这样的化 catch语句就可以根据不同的异常类型进行更加灵活的处理
自定义的异常类 如果继承自 Exception(推荐) 此时就是一个受查异常 如果继承自RuntimeException 就是一个非受查异常