异常处理流程(重点)
异常处理流程(重要)
如果要想进行异常的处理,那么首先需要观察出异常类的继承结构:NumFormatException、ArithmeticException
NumberFormatException继承结构 | ArithmeticException继承结构 |
· |-java.lang.RuntimeException · |- java.lang.IllegalArgumentException · |-ava.lang.NumberFormatException
|
· |- java.lang.Throwable · |-java.lang.RuntimeException · |-java.lang.ArithmeticException
|
发现所有的异常都是Throwable的子类。而Throwable中只有两个子类:
·Exception:指的是程序运行中产生的异常,用户可以通过程序处理;
·Error:程序还没有执行,指的是JVM错误了,用户不能够处理
如果清楚了继承的关系实际上就应该结合对象的多态性(特点:所有的子类对象都能自动转化成父类对象)一起考虑。
1. 当程序在执行的过程之中,如果发现产生了异常,这个时候会由VM根据异常的产生形式来确定一个与之有关系的异常类
并且自动实例化此异常类对象;
2.当异常类对象实例化之后会首先判断在当前的程序中是否由try语句进行异常捕获,如果此时有异常捕获则进行异常处理,如果没有异常捕获,则系统会认为该程序没有能力处理此异常。那么会采用默认的形式,首先进行异常信息的打印,通知用户,而后会将程序进行结束。
3.如果程序中存在有异常处理,则会使用try语句来捕获这个异常类对象,同时该异常产生之后的代码将不再执行,捕获的异常类对象,要与每一个catch的捕获类型进行匹配,如果找到了与之匹配的catch的语句中的代码, 则使用该catch语句中的代码进行处理,随后其余的catch将不再进行匹配处理,而执行finally程序代码;
4.如果现在所有的catch都不能够匹配此异常类对象,则系统会认为该异常无法处理,也同样会继续执行finally类代码
5.那么当执行完finally代码之后会对异常的处理状态进行判断,如果确定之前已经成功的进行了异常的处理,则正常执行后续代码,如果catch没有处理完异常,则将采用默认的处理方式:首先输出异常的信息,而后再进行程序的终端执行
实际上所谓的匹配就是判断某一个异常对象是否是属于某一个异常类的实例。
实际上就属于一个对象的传递问题,那么很明显,某一个对象一定可以呗本类以及本类的父类所接收,那么就意味着,所有的异常类对象都可以使用Exception进行处理。
范例:最简化的异常处理操作
public class TestDemo {
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("【Finally】不管是否产生异常都一定要执行此语句");
}
System.out.println("【3】数学计算结束后");
}
}
但是如果面对于一些开发要求高的环境,Exception可以胜任,
而如果你现在的开发之中异常的处理要求很高,
例如:Oracle数据库里面所有的异常都有一个编码,那么就需要分别处理了。
但是特别需要注意的是,如果你现在使用了catch捕获了多个异常,
那么请保证捕获范围大的要放在捕获范围小的之后,
否则会有语法错误。
范例:错误的捕获(部分代码)
try {
int x=Integer.parseInt(args[0]);
int y=Integer.parseInt(args[1]);
System.out.println("【2】数学计算:"+(x/y));
}catch(Exception e) {
e.printStackTrace();
}
catch(ArithmeticException e) {
e.printStackTrace();
//因为Exception的范围要比ArithmeticException大
}
finally {
System.out.println("【Finally】不管是否产生异常都一定要执行此语句");
}
执行不到的 ArithmeticException 的 catch 块。它已由 Exception 的 catch 块处理。
另外需要提醒的是,在你们所开发的代码之中,不要使用Throwable进行捕获
因为Throwable除了可以描述Exception之外还可以描述所有的Error,而Error是不需要你来处理的。
上一篇: 力扣-11.4-417