对于问题1
int div(int a,int b)throws ArithmeticException,ArrayIndexOutOfBoundsException
04. {
05.
06. int[] arr = new int[a];
07.
08. System.out.println(arr[4]);
09.
10. return a/b;
因为主函数是先执行的 System.out.println(arr[4]);
当角标越界发生的时候 下面的除法return a/b;运算不会执行,程序直接就找到角标越界对应的catch代码块进行处理,然后输出over就结束了.
你将除法运算 和角标越界两个代码 换下位置,那么就会跑出除零异常不抛出角标越界异常.
对于问题2
我也不太清楚具体的原因,我只能猜测,JVM已经捕捉到了两个子类异常,如果父类异常在其之前,异常怎么也不会叫子类catch处理,因为父类异常处理就干了.那么子类异常处理就成了垃圾代码了,所以编译不通过.
而父类异常处理放在下面,却不会成为垃圾代码,因为总有某些异常不是两个子类异常能够处理的,那么最下面的父类异常就有发挥之地,JVM不会判定父类异常处理代码块是垃圾代码,所以编译能通过.
|