赋值操作期间未抛出空指针异常

Posted

技术标签:

【中文标题】赋值操作期间未抛出空指针异常【英文标题】:Null pointer exception not being thrown during assignment operation 【发布时间】:2020-05-03 19:12:01 【问题描述】:

在 java 赋值操作中,对于赋值操作:首先计算右侧表达式,然后分配给左侧。 在下面的代码 sn-p 中,我期望赋值操作会抛出空指针异常,但事实并非如此。谁能解释一下原因?

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;


【问题讨论】:

【参考方案1】:

那是因为你误解了赋值操作顺序。

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

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

【讨论】:

【参考方案2】:

你的问题是这一行:

c.x = tell(c = null);

发生了什么:

    c 设置为 null (c = null) 然后调用tell,并返回一个整数 然后它尝试设置 c.x 但 c 现在为空

【讨论】:

以上是关于赋值操作期间未抛出空指针异常的主要内容,如果未能解决你的问题,请参考以下文章

为何将未被初始化的Integer变量赋值给int变量时会抛出空指针异常?

SearchView 展开抛出空指针异常

为啥非空列表会抛出空指针异常?

Android Canvas drawcolor 抛出空指针异常

HashCode 抛出空指针异常

Play 2.4 Finder 抛出空指针异常