java语言中使用三元式的时候应该注意的问题
2013-08-06 20:32
537 查看
今天在项目中改领导要求的代码表现的时候发现了一个很有趣的问题。但是的代码情况类似如下:
看到代码后,这样在test1为null的情况下,那么打印语句肯定会抛空指针异常的,随即我修改了代码,代码像下面看到的这样:
代码1只是为了验证可以打印null这种情况的。代码2为了验证猜想1,但是呢,代码2是正常被执行了的,猜想1猜想失败了,既然貌似是三元式的第二个元的引起,于是我又猜想错误第三个元没有关系(猜想2),我用下面的代码进行验证:代码3:
我有想起来三元式的形式是: expression1?expression2:expression3于是有了下面的代码:代码4:
结论: 1.java中,三元式中的第二和第三个元都进行了检查,检查的方法需要查看java中对三元式的实现才能确定。 2.expression1?expression2:expression3 这样的形式的三元式,看看就行了,具体需要在使用的时候进行代码验证,否则就像本次问题一样,知识不足造成了bug的出现。以后还是尽量少用三元式,以防止预想之外的结果。上面问题的解决代码:
(完)
本文出自 “越努力,越幸运” 博客,请务必保留此出处http://actor.blog.51cto.com/1764681/1265514
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
相关文章推荐
- java在使用实现了List接口时候应该注意的问题
- java在使用实现了List接口时候应该注意的问题
- 使用prototype.js 的时候应该特别注意的几个问题
- Java笔记之语言基础_使用if语句时要注意的问题
- 使用prototype.js 的时候应该特别注意的几个问题.
- 使用py-solc时候应该注意的问题
- 使用prototype.js 的时候应该特别注意的几个问题.
- java.util.Date类在使用中应该注意的问题
- 公司开发时候,使用svn进行版本控制,在提交代码的时候应该注意的问题,总结!!!!
- 使用dblink和序列的时候应该注意的问题
- JDBC操作timestamp和datetime时候应该注意的问题
- [置顶] java Vector 在多线程使用中需要注意的问题
- Java和jsp编程中应该注意的几个常见问题
- 使用第三方表单检验saripaar的时候,Android SDK版本不同,要注意啦,提示会有点小问题
- 使用java.lang.Integer需要注意的一个问题
- 使用第三方表单检验saripaar的时候,Android SDK版本不同,要注意啦,提示会有点小问题
- JAVA学习中应该注意的一些简单问题?
- Java和JSP编程应该注意的六个常见问题
- 投简历的时候应该注意问题