论坛首页 入门技术论坛

java条件运算符,三目运算符:类型转换导致的错误

浏览 2234 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-03-30   最后修改:2012-03-31
今天在调试代码时,发现这样一个错误,感觉挺有意思,跟想象中的结果不太一样。拿出来大家看看,大家是否一时也未发现错误原因?

代码1:
Java代码 
String flag = "XXX";  
Boolean expected = "false".equals(flag) ? false :("true".equals(flag) ? true : null);  

代码1 会抛个NullPointerException。

代码2:
Java代码 
String flag = "XXX";  
Boolean expected = "false".equals(flag) ? Boolean.FALSE :("true".equals(flag) ? Boolean.TRUE : null); 

代码2 则正常执行。

代码3:
Java代码 
Boolean c = null;  
boolean b = c;
 
代码3运行会报个NullPointerException,据此得出一个基本事实,给基本布尔类型变量赋null值,是会抛空指针异常的。

仍有疑惑的朋友,请往下看:

条件表达式基本格式为:  逻辑运算表达式?表达式1:表达式2;
    “逻辑运算表达式”返回一个布尔值,即true 或 false, 然后根据布尔值,返回表达式1或表达式2的值,在表达式1和表达式2计算值的过程中,有类型转换的过程,即,如果表达式1的类型是Boolean,表达式2类型是boolean,表达式2的值可以被转成Boolean。
    为方便讲解,将代码1的条件运算语句表示为Boolean expected = A ? B : (C ? D : E);代码1运算过程是这样的,先计算A值,如果A是true, 则计算并返回B值;如果A是false,则计算返回(C ? D : E)值。代码1因为A是false,所以会去计算(C ? D : E)的值,因为B是boolean,所以(C ? D : E)的值也应该返回boolean值,这儿可以看作将(C ? D : E)返回值存放于一个boolean的临时变量x里,因为返回的是null,将null赋给boolean临时变量x,所以就NullPointerException异常了。
    好了,分析了代码1,那么代码2为什么是正确的,相信就不难理解了。

以上问题主要分析了java条件表达式的详细运算过程以及其中的表达式类型转换,从而,加深了对一些基本知识的理解,避免犯一些看似低级的错误。

结束了,针对此问题,粘上一些相关代码,供参考:
代码4:
Java代码 
String flag = "XXX";  
Boolean expected = "XXX".equals(flag) ? ("true".equals(flag) ? true : null)  
                : false;  


代码4抛空指针异常。

代码5:
Java代码 
String flag = "XXX";  
Boolean expected = "XXX".equals(flag) ? ("true".equals(flag) ? true : null)  
                : Boolean.FALSE;  
System.out.print(expected);  


论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics