赋值操作期间未抛出空指针异常
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变量时会抛出空指针异常?