我有以下代码片段:
Boolean var=false; boolean var1=(var=null); if(var1){ //it compiles } if(var=null){ //it compiles }
为什么编译?
在Boolean
课堂上我发现了以下内容:
public static boolean parseBoolean(String s) { return ((s != null) && s.equalsIgnoreCase("true")); }
这是否意味着被null
视为false
?为什么=
操作的结果boolean
是false
?这种行为的实际原因是什么?
将null分配给本机类型(如boolean,int等)将导致a NullPointerException
关于第一个问题为什么要编译?
未经编辑的版本:它不编译它会产生编译错误,因为if(null=var) { ...
它不是有效的java代码.你不能分配东西null
,你只能分配null
给某些东西.
您可能希望使用==
而不是比较var
和null
平等.
除此之外,在运行时你会得到一个NPE
正确提到的@Ctx.该行boolean var1=(var=null);
首先分配null
给var
,然后赋值运算符=
将返回它刚刚分配的(null
)并尝试将其赋值给boolean var1
- > NPE
.
"这是否意味着被null
视为false
?" - 不是真的.解析只有当String
它是null
这个被视为false
.这基本上是唯一的地方/情况.
编辑后更改null=var
为var=null
:
现在你的代码将实际编译并崩溃NPE
.让我们一步一步地看看这里发生的事情:
Boolean var=false;
甲Boolean
目的是通过自动装箱所创建的boolean
值false
boolean var1=(var=null);
的第一个操作是(var=null)
哪个分配null
到var
.=
因此返回null
.那么语句是"相当于" boolean var1=null
,编译器会拒绝.遗憾的是,编译器无法推断该语句boolean var1=(var=null);
总是会导致无效的赋值boolean var1=null
.因此代码编译很好但在运行时崩溃.