1.继承Execption异常还是继承RuntimeExecption的区别
想分辨这两种的区别,首先要介绍可检查异常和不可检查异常,何为可检查何为不可检查?可以参考博客Throwable、Exception、Error分析
- 可检查的异常(checked Execption):可检查异常必须在代码中显式的捕获,这是编译期工作的一部分,不然无法通过编译。
- 不可检查异常:不可检查即意味着编译期检测不出来的异常,此类异常是运行时异常(RuntimeExecpiton,除此异常外都是可检查异常)。
RuntimeExecption是Execption的子类,RuntimeExecption是不可检查异常,而Execption是可检查异常,
2.1继承Execption类
当你继承了Execption类,意味着你的类在抛出后必须被处理这样的优劣如下:
- 优点:异常总能被捕获(强制你必须捕获处理,不然不能通过编译),从而来修正程序的运行,使程序能继续运行下去。
- 缺点:异常总是要被捕获:要么继续向上层抛出-方法耦合严重,一旦最内层方法不抛出异常了外层的方法全要改;要么try-catch处理-满屏try-catch或者方法后面全是throws Execption导致代码很不美观。
2.2继承RuntimeExecption类
当你继承了RuntimeExecption,优劣如下:
- 优点:万事大吉,抛出异常我想处理就处理,不想处理也没啥事,程序继续运行(如果他还能正常运行)。
- 缺点: 对于必须处理的异常而你又把它声明成了RuntimeExecption(不可检查异常)。比如说转账,余额不足是可检查异常,正常情况这时候抛异常弹出异常提示程序正常运行,你把余额不足声明成RuntimeExecption,好了,另外一个程序员他不知道捕获这个异常,运行程序也不报错(不可检查异常特质),余额不足,转账继续进行,程序GG。
3 如何选择
所以,继承哪个类是从用法角度来考虑的:
当你是系统架构者:
- 你想减少程序的耦合性,于是你自定义的异常类继承了RuntimeExexption,你又告诉自己的成员,约定好:某某自定义异常一定要在哪一层捕获处理,这样莫得问题。
- 某个异常它不需要处理,但是你要做日志记录,于是你自定义异常类继承RuntimeExecption,并在里面记录日志,ok,这也没问题。
当你是接口提供者
你的程序接口要给用户用,你可以继承Execption,你不和他约定他也会知道,因为他不捕获处理这个异常他编译不了。