为什么必须先捕获ArrayIndexOutOfBoundsException然后再捕获IndexOutOfBoundsException?

时间:2019-06-14 13:43:00

标签: java exception

让我们参考下一个代码:

try{
   /*Code that may throw IndexOutOfBoundsException or ArrayIndexOut......*/
} catch (IndexOutOfBoundsException e){
    /*handle*/
} catch (ArrayIndexOutOfBoundsException e){
    /*handle*/
}
  • 为什么不编译,但是如果切换catch子句的序列,它确实会编译?

  • 也许我必须先编写一个特定的异常,然后再编写一个更通用的异常?

2 个答案:

答案 0 :(得分:5)

因为ArrayIndexOutOfBoundsExceptionIndexOutOfBoundsException扩展而来,这意味着第一个比第二个更具体。

因此,如果有一个ArrayIndexOutOfBoundsException与一个IndexOutOfBoundsException相匹配:换句话说,ArrayIndexOutOfBoundsException的渔获量将无法到达。

要使catch中声明的所有异常均可以访问,您需要将其从最具体的到最普通的顺序进行排序。

答案 1 :(得分:2)

因为ArrayIndexOutOfBoundsExceptionIndexOutOfBoundsException的子类,所以第二个子句不可访问,因为第一个子句总是会捕获异常。