让我们参考下一个代码:
try{
/*Code that may throw IndexOutOfBoundsException or ArrayIndexOut......*/
} catch (IndexOutOfBoundsException e){
/*handle*/
} catch (ArrayIndexOutOfBoundsException e){
/*handle*/
}
为什么不编译,但是如果切换catch子句的序列,它确实会编译?
也许我必须先编写一个特定的异常,然后再编写一个更通用的异常?
答案 0 :(得分:5)
因为ArrayIndexOutOfBoundsException
从IndexOutOfBoundsException
扩展而来,这意味着第一个比第二个更具体。
因此,如果有一个ArrayIndexOutOfBoundsException
与一个IndexOutOfBoundsException
相匹配:换句话说,ArrayIndexOutOfBoundsException
的渔获量将无法到达。
要使catch
中声明的所有异常均可以访问,您需要将其从最具体的到最普通的顺序进行排序。
答案 1 :(得分:2)
因为ArrayIndexOutOfBoundsException
是IndexOutOfBoundsException
的子类,所以第二个子句不可访问,因为第一个子句总是会捕获异常。