11.3处理多个异常
在进行异常捕获与处理时,每一个try语句后也可以设置多个catch语句,用于进行各种不同类型的异常捕获。
范例:捕获多个异常
package cn.kuiba.util;
public class Main {
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 (ArithmeticException e){ //数学异常
e.printStackTrace();
} catch (NumberFormatException e){ //数字格式化异常
e.printStackTrace();
}catch (ArrayIndexOutOfBoundsException e){ //数组越界异常
e.printStackTrace();
}finally { //最终出口,必然执行
System.out.println("【F】不管是否出现异常,我都会执行。");
}
System.out.println("【3】******程序执行完毕******");
}
}
执行结果
【1】****程序开始执行****
【F】不管是否出现异常,我都会执行。
【3】******程序执行完毕******
java.lang.ArrayIndexOutOfBoundsException: 0
at cn.kuiba.util.Main.main(Main.java:7)【1】****程序开始执行****
【F】不管是否出现异常,我都会执行。
【3】******程序执行完毕******
java.lang.ArrayIndexOutOfBoundsException: 0
at cn.kuiba.util.Main.main(Main.java:7)
本程序利用初始化参数的形式输入了两个要参与除法计算的数字,由于需要考虑到未输入初始化参数、数字转型以及算数异常等问题,所以程序中使用了多个catch语句进行异常处理。
11.4异常处理流程
为了能正确地处理异常,那么就需要清楚Java中的异常处理流程。
(1)Java中可以处理的异常全部都是在程序运行中产生的异常,当程序运行到某行代码并且此代码执行出现异常时,会由JVM帮助用户去判断此异常的类型,并且自动进行指定类型的异常类对象实例化处理。
(2)如果此时程序中并没有提供异常处理的支持,则会采用JVM默认异常处理方式,首先进行异常信息的打印;其次直接退出当前的程序。
(3)如果此时程序中存在异常处理,那么这个产生的异常类的实例化对象会被try语句所捕
(4)try捕获到异常之后与其匹配的catch中的异常类型依次进行比对,如果此时与catch中的捕获异常类型相同,则认为应该使用此catch进行异常处理;如果不匹配则继续匹配后续的catch类型;如果没有任何的catch匹配成功,那么就表示该异常无法处理。
(5)不管异常是否处理最终都要执行finally语句,但是当执行完成finally的程序之后会进一步判断当前的异常是否已经处理过了,如果处理过了,则继续向后执行其他代码;如果没有处理则交由JVM进行默认处理。
通过分析可以发现在整个异常处理流程中实际上操作的还是一个异常类的实例化对象,那么这个异常类的实例化对象的类型就成为理解异常处理的核心关键所在,以之前接触过的两种异常继承关系为例。
可以发现所有的异常类最高继承类是Throwable,并且通过JavaDoc文档可以发现在Throwable下有两个子类。
1.Error:JVM错误,这个时候的程序并没有执行,无法处理。
2.Exception:程序运行中产生的异常,用户可以使用异常处理格式处理。
提示:注意Java中的命名 读者可以发现,在Java进行异常类子类命名时都会使用XxxError或XxxException的形式,这样的目的是为了从名称上帮助开发者区分。
范例:简化异常处理
package cn.kuiba.util;
public class Main {
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】******程序执行完毕******");
}
}
此时的异常统一使用Exception进行处理,这样不管程序中出现了何种问题,程序都可以捕获并处理。