我写了一个程序有点令人困惑,我知道它会抛出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();
}
感谢您的帮助
答案 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语言规范。