异常

来源:互联网 发布:知乎 东南亚女人 编辑:程序博客网 时间:2024/04/29 17:54


主要内容:

1. 异常介绍及体系特点

2. 异常的分类及处理方式

3. 自定义异常

4. 异常的注意事项

异常介绍及体系特点:

异常:就是程序在运行是出现了不正常情况。这种不正常情况可以分为严重问题和非严重问题。
在JAVA中,严重问题用Error类来描述,非严重问题用Exception来描述,它们都继承超类Throwable。
对于Error类,一般不编写代码对其处理,对于Exception类可以编写针对性代码进行处理,因此产生一个异常就是产生一个异常对象。
体系图如下:

异常的分类及处理方式:

异常可以分为:编译时被检测的异常、运行时异常(编译时不被检测)
编译时被检测异常(Exception类及其子类),需要在函数上声明;运行时异常(RuntimeException类及其子类),不需要在函数上声明;

异常的处理方式有两种:要么在内部进行try处理,要么直接在函数声明中抛出。
JAVA提供了特有的语句对其处理,有3种组合:
//方式一:try{//需要被检测的代码}catch(异常类 变量){//处理异常的代码}finally{//一定被执行的代码,通常是关闭资源代码}//方式二:try{}catch(){}//方式三:try{}finally{}

对于捕获到的异常的常见方法操作:
String getMessage(); //返回异常详细信息字符串
String toString(); //返回异常的简短描述
void printStackTrace(); //打印异常的堆栈跟踪信息,这实际也是JVM默认的异常处理机制

对多异常的处理:
1)声明异常时,建议声明更为具体的异常,这样可以处理的更具体。
2)对方声明几个异常,就对应几个catch块,如果catch块中的异常出现继承关系,父类的放在下面。
3)建议进行catch处理时,catch中一定要有具体的处理方式,而不是按照默认处理机制,或一条简单的打印语句。

自定义异常:

对象项目中出现java所描述的异常之外的情况,需按照java对异常的封装思想,对特有问题进行自定义封装,这便是所谓自定义异常。

自定义异常的方法:
自定义异常类要继承Exception类或者RuntimeException类。
因为只有异常体系中的对象才具有可抛性,同时也可获得异常操作的共性方法。如果发生异常,需要立即停止程序,那就继承RuntimeException;如果要对异常进行处理,或者声明让使用者对其处理,那么就继承Exception类。

throw和thorws的区别:
throw使用在函数内,后面跟异常对象;需单独存在,下面不能有语句。
throws使用在函数上,后面跟异常类,可以跟多个,用逗号隔开。

自定义异常的原则:
1)处理方式:try处理或者直接抛throws;
2)调用到抛出异常的功能时,抛几个就得处理几个,就是有多少异常,就得有多少catch块;
3)多个异常类如果有继承关系,那么父类的catch块要放在下面。
4)catch处理时,需要定义针对性的处理方式,不要简单定义printStackTrace()、输出语句、或不写。
5)当捕获到异常,本功能不能处理时,可以在catch中继续抛出,或者将异常转换,抛出和功能相关的异常。
当异常可以处理时,且需要将异常产生与功能相关的问题提供出去,可以将捕获的异常转换成新异常,声明让使用知道。
综合以上内容有代码示例:
//自定义除数异常class DivZeroException extends ArithmeticException{DivZeroException(String msg){super(msg);}}//自定义负数异常class NegativeException extends ArithmeticException{NegativeException(String msg){super(msg);}}class Arithmetic{public int Div(int a,int b)throws DivZeroException{//有判断条件,才能抛出异常。if(b == 0)throw new DivZeroException("除数为零了,哥们");return a/b;}public int sum(int a,int b)throws NegativeException{int sum = a+b;if(sum<0)throw new NegativeException("和为负数了,哥们");return sum;}}class ExceptionDemo2{public static void main(String[] args){Arithmetic ar = new Arithmetic();try{System.out.println(ar.Div(5,0));}catch (DivZeroException e){//这里异常处理仅打印了异常信息。System.out.println(e.getMessage());}try{System.out.println(ar.sum(2,-3));}catch (NegativeException e){System.out.println(e.getMessage());}}}


自定义异常的好处:

1)按照java面向对象的思想,将程序中出现的特有问题进行封装

2)将正常流程代码和问题处理代码相分离。

异常的注意事项:

在子类覆盖父类时:
1)子类抛出的异常必须是父类抛出的异常的子类或者子集(父类抛出多异常的情况)。
2)如果父类或接口没有抛出异常时,子类覆盖出现异常只能try处理不能throw。



0 0