gpt4 book ai didi

java - 为什么在检查数组引用表达式是否为空之前评估 Java 数组索引表达式?

转载 作者:IT老高 更新时间:2023-10-28 20:47:59 26 4
gpt4 key购买 nike

根据 JLS,数组访问表达式的运行时求值行为如下:

  1. 首先,计算数组引用表达式。如果这评估突然完成,然后数组访问完成突然出于同样的原因,索引表达式不是评估。
  2. 否则,将计算索引表达式。如果这评估突然完成,然后数组访问完成突然出于同样的原因。
  3. 否则,如果数组的值引用表达式为 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?

最佳答案

一个数组访问表达式有两个子表达式:

An array access expression contains two subexpressions, the array reference expression (before the left bracket) and the index expression (within the brackets).

这两个子表达式在数组访问表达式本身之前被计算,以便计算表达式。

计算两个子表达式后

nada()[index = 2]++;

变成

null[2]++;

现在只计算表达式并抛出 NullPointerException

这与 Java 中大多数表达式的求值一致(我能想到的唯一反例是短路运算符,例如 && 和 ||)。

例如,如果您进行以下方法调用:

firstMethod().secondMethod(i = 2);

首先你评估 firstMethod()i = 2,然后你才抛出 NullPointerException if firstMethod() 评估为 null

关于java - 为什么在检查数组引用表达式是否为空之前评估 Java 数组索引表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55160799/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com