Java-异常处理
Java语言具有如下的异常处理机制:当程序运行出现意外情形时,系统会自动生成一个异常对象来通知程序。在程序中,我们可以使用特定的语句来捕获异常对象,读取对象中的信息,进而做出处理。也可以使用特定的语句抛出异常对象,将这个异常对象交给程序的调用者处理。
异常的继承体系
- 所有的非正常情况被分为两类:
错误(Error)和异常(Exception),其中Error代表虚拟机相关问题,一般无法处理,也无需处理。
- 所有的 Exception 被分为两类
- RuntimeException,代表运行时异常,程序可以显式处理这种异常,也可以不处理,而是交给顶层调用者统一处理。
- 非运行时异常(Checked异常),程序必须显式地处理这种异常,否则在编译阶段会发生错误,导致程序无法通过编译。
捕获异常
语法:
try {业务逻辑代码}catch (AException e) {A异常的处理代码}catch (BException e) {B异常的处理代码}...finally {回收资源代码}
说明:
- 无论哪行代码发生异常,系统都会生成一个异常对象,这与try...catch...语句没有关系;
- 若程序没有对这个异常对象做任何处理,则程序在此退出;
- 创建异常对象后,JVM会寻找可以处理它的catch块,并将异常对象交给这个catch块去处理;
- 程序应该先处理小异常、再处理大异常,即将处理父类异常的catch块放在处理子类异常的catch块之后;
- finally块中代码总是会被执行,它必须位于try、catch之后,通常用来释放资源;
- try是必须的,catch、finally是可选的,但catch、finally二者之中至少要出现一个。
声明抛出异常
语法:
throws ExceptionClass1, ExceptionClass2, ...
说明:
- throws语句用于标识某方法可能抛出的异常,它必须位于方法签名之后;
- throws语句声明抛出异常后,程序中旧无需使用try语句捕获该异常了;
- 在重写时,子类方法声明抛出的异常类型不能比父类方法声明抛出的异常类型大。
抛出异常
语法:
throw ExceptionInstance;
说明:
- throw语句用于在程序中主动抛出一个异常;
- throw语句抛出的不是异常类型,而是一个异常实例;
- 对于主动抛出的异常,也可以采用try块捕获,或者采用throws语句向外抛出。
异常的处理原则
- 不要多度的使用异常:
不要用异常处理代替错误处理代码,不要用异常处理代替流程控制语句;
- 不要忽略捕获的异常:
对于捕获到的异常,要进行合适的修复,对于不能处理的部分,应该抛出新的异常;
- 不要直接捕获所有的异常:
应对不同的异常做出有针对性的处理,而捕获所有的异常,容易压制(丢失)异常;
- 不要使用过于庞大的try块:
庞大的try块会导致业务过于复杂,不利于分析异常的原因,也不利于程序的阅读及维护。