上一篇:强悍的异常处理-处理多个异常 | 带你学《Java面向对象编程》之七十七
【本节目标】
通过阅读本节内容,你将了解到捕获异常实际上也是在操作一个异常类的实例化对象,并学会使用Exception来捕获自己未知的异常。
异常处理流程
在进行异常处理的时候如果将所有可能已经明确知道要产生的异常都进行了捕获,虽然可以得到非常良好的代码结构,但是这种代码编写是非常麻烦的,所以现在要想进行合理异常就必须清楚在异常产生之后程序到底做了哪些处理。
图一 Java异常处理流程
- 在程序运行的过程之中才会产生异常,而一旦程序执行中产生了异常之后将自动进行指定类型的异常类对象实例化处理;
- 如果此时程序之中并没有提供有异常处理的支持,则会采用JVM的默认异常处理方式首先进行异常信息的打印,而后直接退出当前的程序;
- 此时程序中如果存在有异常处理,那么这个产生的异常类的实例化对象将会被try语句所捕获;
- try捕获到异常之后与其匹配的catch中的异常类型进行依次的比对,如果此时与catch中的捕获异常类型相同,则认为应该采用此catch进行异常处理,如果不匹配则继续匹配后续的catch类型,如果没有任何的catch匹配成功,那么就表示该异常无法进行处理;
- 不管异常是否进行处理最终都要执行finally的语句,但是当执行完成finally的程序之后会进一步判断当前的异常是否已经处理过了,如果已经处理过了,则继续向后执行其它代码,如果没有处理,则交由JVM进行默认的处理。
通过分析可以发现在整个的异常处理流程之中实际上操作的还是一个异常类的实例化对象,那么这个异常类的实例化对象的类型就成为了理解异常处理的核心关键所在。在之前接触的几种异常的两个:
ArithmeticException: | ArrayIndexOutOfBoundsException: |
---|---|
java.lang.Object java.lang.Throwable java.lang.Exception java.lang.RuntimeException java.lang.ArithmeticException |
java.lang.Object java.lang.Throwable java.lang.Exception java.lang.RuntimeException java.lang.IndexOutOfBoundsException java.lang.ArrayIndexOutOfBoundsException |
可以发现在程序之中可以处理的异常的最大的类型就是Throwable,而打开Throwable可以观察到在此类中提供有两个子类:
- Error:此时程序还未执行出现的错误,开发者无法处理;
- Exception:程序中出现的异常,开发者可以处理,真正在开发中所需要关注的就是Exception;
通过分析可以发现异常产生的时候会产生异常的实例化对象,那么按照对象的引用原则,可以自动向父类转型,那么如果按照这样的逻辑,实际上所有的异常都可以使用Exception来处理。
范例:简化异常处理
public class JavaDemo{
public static void main(String args[]) {
System.out.println("【1】*****程序开始执行*****") ;
try {
int x = Integer.parseInt(args [0]) ;
int y = Integer.parseInt(args [1]) ;
System.out.println("【2】数学计算:" +(x / y)) ;
}catch (Exception e) {
e.printStackTrace() ;
}finally {
System.out.println("【F】不管是否出现异常,我都会执行。") ;
}
System.out.println("【3】*****程序执行完毕*****") ;
}
}
当不确定可能产生哪些异常的时候,这种处理是最方便的。但是如果这样处理也会产生一个问题。这种异常处理的形式虽然方便,但是它描述的错误信息不明确,分开处理异常是一种可以更加明确的处理方式。
在以后进行多个异常同时处理的时候,要把捕获范围大的异常 放在捕获范围小的异常之后。
想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学