哪一个具有更多优先级ArithmeticException和ArrayIndexOutOfBoundsException

时间:2016-10-26 12:11:37

标签: java exception-handling

我写了一个程序有点令人困惑,我知道它会抛出ArithmeticException但在此之前它将通过ArrayIndexOutOfBoundsException按照我的预期但它总是抛出ArithmeticException

我有以下代码:

try{
            int arrray[]={1,3};
            arrray[2]=3/0+arrray[5];
        }catch(ArrayIndexOutOfBoundsException ie){
            ie.printStackTrace();
        }
        catch(ArithmeticException ie){
            ie.printStackTrace();
        }
        catch(Exception e){
            e.printStackTrace();
        }

感谢您的帮助

3 个答案:

答案 0 :(得分:1)

它不是Exception的优先级,而是按照您的表达式arrray[2]=3/0+arrray[5];的求值顺序,这里按照 BODMAS 规则划分,首先对3/0求值,所以{{ 1}}将被调用。

答案 1 :(得分:0)

肯定会是ArithmeticException。根据{{​​3}},第一个除法运算符将被计算Divide by ZERO,它将抛出ArithmeticException。

答案 2 :(得分:0)

测试它很容易找到:

$ cat Demo1.java 
class Demo1 {
  public static void main(String[] args) {
    try {
      int[] array = {};
      int impossible = 1/0 + array[0];
    } catch (Exception e) {
      System.out.println("Caught " + e.getClass().getSimpleName());
    }
  }
}

$ cat Demo2.java 
class Demo2 {
  public static void main(String[] args) {
    try {
      int[] array = {};
      int impossible = array[0] + 1/0;
    } catch (Exception e) {
      System.out.println("Caught " + e.getClass().getSimpleName());
    }
  }
}

$ cat Demo3.java 
class Demo3 {
  public static void main(String[] args) {
    try {
      int[] array = {};
      array[0] = 1/0 + array[0]; // assignment happens last
    } catch (Exception e) {
      System.out.println("Caught " + e.getClass().getSimpleName());
    }
  }
}

$ javac Demo*.java

$ java Demo1
Caught ArithmeticException

$ java Demo2
Caught ArrayIndexOutOfBoundsException

$ java Demo3
Caught ArithmeticException

正如您所看到的那样,既没有优先权,也取决于它的顺序。表达式的子组件按从左到右的顺序进行求值,因此如果左侧操作数引发异常,则从不评估右侧。

由于在表达式评估期间发生异常,因此永远不会发生对array[2]的分配,因为在右侧的表达式已被执行为可分配的值之前,分配不会发生。

This answer详细介绍了定义此行为的相关Java语言规范。