赋值操作期间未引发空指针异常

Null pointer exception not being thrown during assignment operation

提问人:Raj 提问时间:1/17/2020 更新时间:1/17/2020 访问量:81

问:

在 java 赋值操作中,对于赋值操作:首先计算右侧表达式,然后赋值到左侧。 在下面的代码片段中,我期望赋值操作会抛出 Null 指针异常,但事实并非如此。有人可以解释为什么吗?

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 NullPointerException 引用 赋值运算符

评论


答:

0赞 ControlAltDel 1/17/2020 #1

您的问题是这一行:

c.x = tell(c = null);

正在发生的事情是:

  1. c 设置为 null (c = null)
  2. 然后发生 tell 调用,并返回一个整数
  3. 然后它尝试设置 c.x,但 c 现在为 null
1赞 ardenit 1/17/2020 #2

那是因为你误解了分配操作顺序。

“首先计算右侧表达式,然后分配给左侧”表示在计算右侧值后将右侧值分配给左侧值。它没有说明计算左值的顺序。

在 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;
    }
}