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

[align=right]【本博原创文章】[/align]

今天在调试代码时,发现这样一个错误,感觉挺有意思,跟想象中的结果不太一样。拿出来大家看看,大家是否一时也未发现错误原因?

代码1:
String flag = "XXX";
Boolean expected = "false".equals(flag) ? false :("true".equals(flag) ? true : null);
代码1 会抛个NullPointerException。

代码2:
String flag = "XXX";
Boolean expected = "false".equals(flag) ? Boolean.FALSE :("true".equals(flag) ? Boolean.TRUE : null);
代码2 则正常执行。

代码3:
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:
String flag = "XXX";
Boolean expected = "XXX".equals(flag) ? ("true".equals(flag) ? true : null)
: false;

代码4抛空指针异常。

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

代码5正常执行,打印出null。

你可能感兴趣的:(java基础,条件运算符,三目运算符,java,类型转换)