【发布时间】:2019-08-05 05:54:43
【问题描述】:
根据 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;
}
}
问题是:出于什么原因,我们需要首先评估 index = 2 表达式,而不是在数组引用被评估为 null 时抛出 NullPointerException?或者换句话说 - 为什么顺序是 1,2,3 而不是 1,3,2?
【问题讨论】:
-
首先你必须初始化一个数组,其次等号的优先级很高,这就是它给定空指针异常的原因。
-
问为什么 JLS 是这样写的,除非它可能来自 Java 语言的设计者之一,否则不会给你任何好的答案。
-
他们必须做出选择,而这两种选择都会产生“意想不到的”场景。 (即行为方式不是很直观的场景)。所选择的选项似乎更符合 Java 其他部分中表达式评估的工作方式。
-
@fantaghirocco 我没有询问java如何评估数组索引表达式,它在问题中有所描述。我只是想知道这种行为背后的原因。
标签: java language-lawyer