您的位置:首页 > 编程语言 > Java开发

java语言中使用三元式的时候应该注意的问题

2013-08-06 20:32 537 查看
今天在项目中改领导要求的代码表现的时候发现了一个很有趣的问题。但是的代码情况类似如下:
Integer test1 = null;
System.out.println("test1 = " + (test1+1));


看到代码后,这样在test1为null的情况下,那么打印语句肯定会抛空指针异常的,随即我修改了代码,代码像下面看到的这样:
Integer test1=null;
System.out.println("test1 = " + (test1==null?test1:(test1+1)));
就是上面的代码出现了同样的问题,还是在抛空指针一场的问题,不应该啊?!难道是java对三元式的处理是全部计算的?(猜想1)于是我写了下面的代码进行验证:代码1:
System.out.println("test1 = "+ null);
代码2:
Integer test1=null;
System.out.println("test1 = " + (test1==null?-1:(test1+1)));


代码1只是为了验证可以打印null这种情况的。代码2为了验证猜想1,但是呢,代码2是正常被执行了的,猜想1猜想失败了,既然貌似是三元式的第二个元的引起,于是我又猜想错误第三个元没有关系(猜想2),我用下面的代码进行验证:代码3:
Integer test1=null;
System.out.println("test1 = "+ (test1==null?test1:test1));
代码3如上所说是为了排除和第三个元无关的,然后猜测代码正常执行的,但是,实际情况还是报空指针异常了。猜测1和猜测2失败后,就能得到,跟三元式的2和3元都有关系。

我有想起来三元式的形式是: expression1?expression2:expression3于是有了下面的代码:代码4:
Integer test1=null;
Integer test2=(test1==null?test1:(test1=123));
System.out.println("test1 = " + test1);
代码4正常执行,输出了
test1 = null
,又看着
第三个元没有执行。再验证:代码5:
Integer test1=null;
Integer test2=(test1==null?test1:(System.out.println("test1")));
System.out.println("test1 = " + test1);
代码5语法直接都有问题,不应该啊?! 这段代码是应该出问题的,自己理解有误,在2,3元上需要一个返回值的计算式而
System.out.println(
"test1"
)
没有返回值,所以理应出错。

结论: 1.java中,三元式中的第二和第三个元都进行了检查,检查的方法需要查看java中对三元式的实现才能确定。 2.expression1?expression2:expression3 这样的形式的三元式,看看就行了,具体需要在使用的时候进行代码验证,否则就像本次问题一样,知识不足造成了bug的出现。以后还是尽量少用三元式,以防止预想之外的结果。上面问题的解决代码:
Integer tmp= null;
if(test1==null){
tmp=null;
}else{
tmp=test1;
}
(完)今天在stackoverflow中提出了这个问题,然后有大牛解决了http://stackoverflow.com/questions/18124745/java-ternary-operator-and-nullpointerexception在java中关于三元运算符有这么一个特性:1.在第二个元和第三个元的类型相同的时候,那么返回一个2,3元的类型。
(test1==
null
?test1:test1)
也就是这句代码没有出错,返回的是一个Integer类型的值,Integer类型是允许有null的,所以本身代码就不会出问题。2.在第二个元或者第三个元有基本类型的T的时候,那么不管另一个元是什么类型,都要最小化成基本类型T,所以如下的代码返回的是int类型,但是test1是null,这里有一个boxing的处理,所以造成了,返回的int类型有null值,最终造成了NPE异常的出现:
test2=(test1==null?test1:-1);
test2=(test1==null?test1:(test1+1));
问题解决,从本个问题看来,是我的知识不足造成的,下面是java给的官方解释:http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.25
(完)

本文出自 “越努力,越幸运” 博客,请务必保留此出处http://actor.blog.51cto.com/1764681/1265514
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: