异常处理机制
看过一些博客在讲异常处理,看完后我写一下自己目前的理解,若以后有新的理解再更新。
首先,何为异常?指的是程序运行过程中由于程序出现不可预知的状况导致程序中断的情况。
异常分为编译异常跟运行时异常,我这里只讲运行时异常。
异常类的继承关系也就不写了,这个看jdk文档或者很多博客都有。
我只想搞清楚两点,
1.为啥要用try catch finally用跟不用的区别是啥?如果程序报错,那么程序立即中断。但使用了try catch finally后,程序首先对try包括的
代码进行监控,如果发生异常,则会通过catch去匹配异常类(关于你在catch里到底该写什么异常类,我觉的主要凭经验了,比如你要操作文件流肯定IOException,而且如果你写错编辑器会提醒你,到不用担心,try块里是关于io读写的代码,那么如果你catch写反射异常类那么程序编译都不通过),catch块写你进行异常处理的代码,一般把异常信息打印出来。然后!继续执行finally里的代码!继续执行后续的代码!
如果没有发生异常,就正常执行try { ... }
语句块,然后执行finally
。如果发生了异常,就中断执行try { ... }
语句块,然后跳转执行匹配的catch
语句块,最后执行finally
。可见,finally
是用来保证一些代码必须执行的。
某些情况下,可以没有catch
,只使用try ... finally
结构
注意:上述情况是在捕获异常但并未抛出的情况,如果catch块中写了类似throw new RuntimeException(e)结构进行抛出异常,则程序执行顺序是先catch块再finally块再抛出异常信息
try { Integer.parseInt("abc"); } catch (Exception e) { System.out.println("catched"); throw new RuntimeException(e); } finally { System.out.println("finally"); throw new IllegalArgumentException(); } //这段代码中按照异常抛出顺序是先执行finally中的代码,再回到catch块 //抛出运行时异常,那么这段代码先在finally中抛出异常了,还会继续在catch中抛异常吗?答案是不会,在一个try中只会抛出一个异常,后边的会被忽略。
tips:最好不要在finally中抛出异常,如果你非得抛那么也请别丢失了catch中的异常信息,可以声明一个Exception origin,来保存catch中的异常信息,然后在finally中添加
到e中,e.addSuppressed(origin)
2.为啥有了try还要用方法层面通过throws Exception形式抛出异常?
3.自定义异常
public class MyBaseException extends RuntimeException
再重写所以构造方法
引用一篇写的比较好的https://blog.csdn.net/qq_31615049/article/details/80952216