在java赋值操作中,对于赋值操作:首先计算右侧表达式,然后分配给左侧表达式。 在下面的代码片段中,我希望赋值操作会抛出空指针异常,但它没有。有人可以解释为什么吗?
public class MainClass {
public static void main(String[] args) {
Class1 c = new Class1();
c.x = tell(c = null);
}
private static int tell(Object o) {
return 11;
}
}
public class Class1 {
public int x;
}
那是因为你误解了赋值操作顺序。
"首先计算右侧表达式,然后分配给左侧"表示在计算右侧值后将右侧值分配给左侧值。它没有说明评估左值的顺序。
在 Java 中,首先评估左侧,然后评估右侧,然后将右侧分配给左侧。可以通过运行以下代码来验证这一点:
public class MainClass {
public static void main(String[] args) {
Class1 c = new Class1();
(c.echo("left")).x = tell(c.echo("right")); // Prints "left", then "right"
}
private static int tell(Object o) {
return 11;
}
}
public class Class1 {
public int x;
public Class1 echo(String text) {
System.out.println(text);
return this;
}
}
你的问题是这一行:
c.x = tell(c = null);
正在发生的事情是:
c- 设置为空 (c = 空(
- 然后调用 tell 发生,并返回一个整数
- 然后它尝试设置 c.x,但 c 现在是空 的