Java boolean null cast

ava*_*lon 0 java

我有以下代码片段:

Boolean var=false;
boolean var1=(var=null);

if(var1){
   //it compiles
}
if(var=null){
   //it compiles
}
Run Code Online (Sandbox Code Playgroud)

为什么编译?

Boolean课堂上我发现了以下内容:

public static boolean parseBoolean(String s) {
        return ((s != null) && s.equalsIgnoreCase("true"));
}
Run Code Online (Sandbox Code Playgroud)

这是否意味着被null视为false?为什么=操作的结果booleanfalse?这种行为的实际原因是什么?

Ctx*_*Ctx 6

将null分配给本机类型(如boolean,int等)将导致a NullPointerException


luk*_*302 5

关于第一个问题为什么要编译?

未经编辑的版本:它不编译

它会产生编译错误,因为if(null=var) { ...它不是有效的java代码.你不能分配东西null,你只能分配null给某些东西.

您可能希望使用==而不是比较varnull平等.

除此之外,在运行时你会得到一个NPE正确提到的@Ctx.该行boolean var1=(var=null);首先分配nullvar,然后赋值运算符=将返回它刚刚分配的(null)并尝试将其赋值给boolean var1- > NPE.

  • "这是否意味着被null视为false?" - 不是真的.解析只有当String它是null这个被视为false.这基本上是唯一的地方/情况.

编辑后更改null=varvar=null:

现在你的代码将实际编译并崩溃NPE.让我们一步一步地看看这里发生的事情:

Boolean var=false;Boolean目的是通过自动装箱所创建的booleanfalse
boolean var1=(var=null);的第一个操作是(var=null)哪个分配nullvar.=因此返回null.那么语句是"相当于" boolean var1=null,编译器拒绝.遗憾的是,编译器无法推断该语句boolean var1=(var=null);总是会导致无效的赋值boolean var1=null.因此代码编译很好但在运行时崩溃.

  • 请注意,OP静音通过操纵问题使您的答案无效.但由于编辑历史仍然存在,这应该不是问题. (2认同)