博客信息

面向对象之异常(自定义异常、RuntimeException、异常finally)

发布时间:『 2019-05-26 18:52』  博客类别:java基础  阅读(660)

自定义异常

因为项目中会出现特有的问题,

而这些问题并未被Java所描述并封装对象,

所以对于这些特有的问题,可以按照Java对问题封装的思想,

将特有的问题,进行自定义的异常封装;

 

需求:

1、在程序中,对于除数是-1,也视为是错误的,是无法进行运算的;那么就需要对这个问题进行自定义的描述;

2、需要在捕捉异常的时候打印更加详细的异常信息

3、简化代码

4、希望在错误信息中看到除数为负数的具体的值

 

解决需求的第一点

小李飞刀_面向对象

 

注意:一般情况函数内出现异常,函数上需要声明;

发现打印的结果中只有异常的名称,却没有异常的信息,

因为自定义的异常并未定义信息;

 

如何定义异常信息呢?

下面完成需求的第二点

小李飞刀_面向对象

 

以上代码是可以满足需求中第二点的要求,但是我们发现代码稍微有点多,通过查阅jdkAPI,我们发现相似的代码块在Throwable这个类中已经出现了;

 

接下来我们来完成需求中的第三点

小李飞刀_面向对象

 

结论:因为父类中已经把异常信息的操作都完成了,所以子类只要在构造时,将异常

信息通过Super语句传递给父类,那么就可以直接通过getMessage方法获取自定义

的异常信息;

 

想要在自定义异常中具有自身特有的异常信息?

完成需求中的第四点:

小李飞刀_面向对象

 

注意:自定义异常必须是自定义类继承Exception

 

继承Exception的原因:

异常体系有一个特点:因为异常类和异常对象都可被抛出,

他们都具备可抛性,这个可抛性是Throwable这个体系中特有特点

 

只有这个体系中的类和对象才可以被throwsthrow操作;

 

 

Throwsthrow的区别?

使用的位置不同:throws使用在函数上,throw使用在函数内;

关键字后面跟的东西不一样:

Throws后面跟的异常类,可以跟多个,用逗号隔开;

Throw后面跟的是异常对象;

 

RuntimeException

Exception中有一个特殊的子类异常RuntimeException运行时异常。

 

如果在函数内抛出该异常,函数上可以不用声明,编译一样通过;

 

如果在函数上声明了该异常,调用者可以不用进行处理,编译一样通过;

 

之所以不用在函数上声明,是因为不需要让调用者进行处理;

当该异常发生时,希望程序停止,因为在运行时,出现了无法继续运算的情况,希望停止程序后,对代码进行修正;

 

 

自定义异常时,如果该异常的发生,无法再继续进行运算,就让自定义异常继承RuntimeException

 

之前的代码就可以更改为

小李飞刀_面向对象

 

 

其实RuntimeExceptionObject这个超类上就有了应用,Object中有一个wait方法;方法上声明了一个异常,但是方法内部跑出了三个异常;

这是为什么呢?

原因在于另外两个没被声明的异常是RuntimeException的子类,出现那两个异常的时候,程序就没必要运行了。

 

小李飞刀_面向对象

 

小李飞刀_面向对象 

对于异常分两种:

1、编译时被检测的异常(需要在函数上声明,调用者需要对该异常进行对应的处理)

2、编译时不被检测的异常(运行时异常,RuntimeException以及其子类)

函数上不需要声明,调用者不需要处理,程序运行出错,就让程序停止不要运行下去了;

 

异常finally

 

小李飞刀_面向对象

 

Finally的应用

小李飞刀_面向对象

分层思想在异常处理中的应用:

这通常是一个dao方法,用来专门处理与数据库交互的问题,method操作数据的过程中,可能会出现各种异常,如要删除的数据不存在,插入的数据与表列段不匹配等等;

 

这些异常问题,定义method的方法的人是能够处理的,因为该程序员是专门操作数据库的,但是如果该程序员处理完后,没有将异常发生后的结果告知调用method方法的程序员,那么代码的设计就不合理了;

 

正确的方法就如上图,数据库程序员将数据操作异常进行处理,然后自定义一个数据保存异常(NoSaveException)返回给调用方,这时method方法的调用方就知道数据没有保存成功了,然后调用方的程序员就可以自行针对NoSaveException进行代码 逻辑的处理;




关键字:     Java基础       面向对象       异常  

备案号:湘ICP备19000029号

Copyright © 2018-2019 javaxl晓码阁 版权所有