因为项目中会出现特有的问题,
而这些问题并未被Java所描述并封装对象,
所以对于这些特有的问题,可以按照Java对问题封装的思想,
将特有的问题,进行自定义的异常封装;
需求:
1、在程序中,对于除数是-1,也视为是错误的,是无法进行运算的;那么就需要对这个问题进行自定义的描述;
2、需要在捕捉异常的时候打印更加详细的异常信息
3、简化代码
4、希望在错误信息中看到除数为负数的具体的值
解决需求的第一点
注意:一般情况函数内出现异常,函数上需要声明;
发现打印的结果中只有异常的名称,却没有异常的信息,
因为自定义的异常并未定义信息;
如何定义异常信息呢?
下面完成需求的第二点
以上代码是可以满足需求中第二点的要求,但是我们发现代码稍微有点多,通过查阅jdk的API,我们发现相似的代码块在Throwable这个类中已经出现了;
接下来我们来完成需求中的第三点
结论:因为父类中已经把异常信息的操作都完成了,所以子类只要在构造时,将异常
信息通过Super语句传递给父类,那么就可以直接通过getMessage方法获取自定义
的异常信息;
想要在自定义异常中具有自身特有的异常信息?
完成需求中的第四点:
注意:自定义异常必须是自定义类继承Exception;
继承Exception的原因:
异常体系有一个特点:因为异常类和异常对象都可被抛出,
他们都具备可抛性,这个可抛性是Throwable这个体系中特有特点
只有这个体系中的类和对象才可以被throws和throw操作;
Throws与throw的区别?
使用的位置不同:throws使用在函数上,throw使用在函数内;
关键字后面跟的东西不一样:
Throws后面跟的异常类,可以跟多个,用逗号隔开;
Throw后面跟的是异常对象;
Exception中有一个特殊的子类异常RuntimeException运行时异常。
如果在函数内抛出该异常,函数上可以不用声明,编译一样通过;
如果在函数上声明了该异常,调用者可以不用进行处理,编译一样通过;
之所以不用在函数上声明,是因为不需要让调用者进行处理;
当该异常发生时,希望程序停止,因为在运行时,出现了无法继续运算的情况,希望停止程序后,对代码进行修正;
自定义异常时,如果该异常的发生,无法再继续进行运算,就让自定义异常继承RuntimeException;
之前的代码就可以更改为
其实RuntimeException在Object这个超类上就有了应用,Object中有一个wait方法;方法上声明了一个异常,但是方法内部跑出了三个异常;
这是为什么呢?
原因在于另外两个没被声明的异常是RuntimeException的子类,出现那两个异常的时候,程序就没必要运行了。
对于异常分两种:
1、编译时被检测的异常(需要在函数上声明,调用者需要对该异常进行对应的处理)
2、编译时不被检测的异常(运行时异常,RuntimeException以及其子类)
函数上不需要声明,调用者不需要处理,程序运行出错,就让程序停止不要运行下去了;
Finally的应用
分层思想在异常处理中的应用:
这通常是一个dao方法,用来专门处理与数据库交互的问题,method操作数据的过程中,可能会出现各种异常,如要删除的数据不存在,插入的数据与表列段不匹配等等;
这些异常问题,定义method的方法的人是能够处理的,因为该程序员是专门操作数据库的,但是如果该程序员处理完后,没有将异常发生后的结果告知调用method方法的程序员,那么代码的设计就不合理了;
正确的方法就如上图,数据库程序员将数据操作异常进行处理,然后自定义一个数据保存异常(NoSaveException)返回给调用方,这时method方法的调用方就知道数据没有保存成功了,然后调用方的程序员就可以自行针对NoSaveException进行代码 逻辑的处理;
备案号:湘ICP备19000029号
Copyright © 2018-2019 javaxl晓码阁 版权所有