2015-12-28 25 views
-1

我有下面的代码片段:的Java布尔空铸

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?为什么=运行的结果是booleanfalse?这种行为的实际原因是什么?

+3

你为什么不启动你的程序,看看会发生什么? Btw:'if(null = var)'不会编译... – Tom

+0

'if(null = var)'永不编译。 –

+0

P.S:Var1可能是真的。 =将会比较一个值==。在“boolean var1 =(var = null);” parentesis只是一个声明。并在“if(null = var){”它不应该编译。您无法将值设为空 – borjab

回答

4

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

未经编辑:它不编译

它会给编译错误,因为if(null=var) { ...是无效的Java代码。你不能指定一些东西到null,你只能分配null东西。

您可能希望使用==代替varnull之间的相等性。

除此之外,在运行时您将得到一个NPE,因为@Ctx已经正确提及。行boolean var1=(var=null);将首先将null分配给var,然后分配运算符=将返回它刚分配的内容(null)并尝试将其分配给boolean var1NPE

  • “这是否意味着是null视为false?” - 真的。仅当解析Stringnull时,才会将其视为false。这基本上是唯一的地方/情况。

编辑改变null=varvar=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。因此,代码编译良好,但在运行时崩溃。

+2

请注意,OP沉默通过操纵问题使您的答案失效。但由于编辑历史依然存在,这应该不成问题。 – Tom

+1

@Tom谢谢你通知我。 – luk2302

5

分配零到本机类型(如布尔,INT等)会导致NullPointerException

0

起初,你知道Booleanboolean之间的区别吗?因为分配nullboolean将导致java.lang.NullPointerException

0

i。首先你的代码不会被编译。如果(null = var){0127}它编译为}行,它会给你编译错误

ii。第二件事是,当初始化一个原始数据类型时,你不能分配一个空值。如果你在编译时分配它,它会给你一个编译错误。但是如果你在运行时做它,它会给出一个nullPointerException。就像那样boolean b = null;在java中无效。但是布尔值bObj = null;有效。而在你的代码中,当你正在做(var = null)它实际上返回null值。因此,boolean var1 =(var = null);变成boolean var1 = null;。这里...变量var1被赋值为null以运行时基为基础的值。所以,它会给出nullPointerException

0

代码将是这样写的

Boolean var = false; 
    boolean var1 = (var == null); 
    if (var1) { 
     //it compiles 
    } 
    if (var == null) { 
     //it compiles 
    } 

var != null的原因是,空,Boolean.FALSE不共享同一个memeory

+0

'boolean var1 =(var = null);'编译正常,但会在运行时造成异常。 – Tom

+0

你是对的,你能解释它为什么可以complile,因为没有返回值'=' – yanghaogn

+0

有一个返回值:变量的值。这就是为什么你也可以写'int a,b,c; a = b = c = 1;' – Tom