为什么在检查数组引用表达式是否为 null 之前计算 Java 数组索引表达式?
2022-09-01 05:08:11
根据 JLS,数组访问表达式的运行时计算行为如下:
- 首先,计算数组引用表达式。如果此计算突然完成,则数组访问由于同样的原因突然完成,并且不计算索引表达式。
- 否则,将计算索引表达式。如果此评估突然完成,则数组访问将出于同样的原因突然完成。
- 否则,如果数组引用表达式的值为 null,则引发 NullPointerException。
所以这段代码将打印:java.lang.NullPointerException,index=2
class Test3 {
public static void main(String[] args) {
int index = 1;
try {
nada()[index = 2]++;
} catch (Exception e) {
System.out.println(e + ", index=" + index);
}
}
static int[] nada() {
return null;
}
}
问题是:出于什么原因,我们需要首先计算表达式,而不是在数组引用计算为 null 后只抛出 NullPointerException?或者换句话说 - 为什么顺序是1,2,3而不是1,3,2?index = 2