描述
方法之间的调用以及throws抛出异常,使异常的传播形成反向异常传播链。如果在抛出异常的方法中没有完全捕获异常(异常没被捕获,或异常被处理后重新抛出了新异常),那么异常将从发生异常的方法逐渐向外传播,首先传给该方法的调用者,该方法调用者再次传给其调用者…直至main方法,如果main方法依然没有处理该异常,JVM抛出该异常,打印异常跟踪栈信息,终止程序。
案例
public class Test {
private static int[] arr = {1,2,3,4};
//方法A用throws抛出异常
public static void funA(int index) throws ArrayIndexOutOfBoundsException{
System.out.println("方法funA");
System.out.println(arr[index]);
}
//方法B调用方法funA,抛出异常
public static void funB(int index) throws ArrayIndexOutOfBoundsException{
System.out.println("方法funB");
funA(index);
}
//方法C调用方法funB,处理异常
public static void funC(int index){
System.out.println("方法funC");
try {
funB(index);
}catch (ArrayIndexOutOfBoundsException e){
e.printStackTrace();
}finally {}
}
//主方法
public static void main(String[] args) {
funC(-2);
}
}
案例分析
案例第5行方法funA()抛出ArrayIndexOutOfBoundsException;第13行方法funB()调用方法funA(),但没有处理方法funA()抛出的异常;第11行用throws继续抛出ArrayIndexOutOfBoundsException,第20行方法funC()调用方法funB(),使用try…catch…finally语句处理funB()抛出的ArrayIndexOutOfBoundsException。