三目表达式 java_Java 三目运算符表达式的一些问题

三目表达式 java_Java 三目运算符表达式的一些问题最近在处理一个需求,需求描述如下:对数据库中查询出来的数据的某一个字段做一个简单处理。处理方式是:如果该字段的值(取值范围0~4,有可能为null)等于0,那么默认处理成1。测试代码如下:1publicclassTestNull{23privateIntegerstarLevel;45publicIntegergetStarLevel(){6ret…

大家好,欢迎来到IT知识分享网。

最近在处理一个需求,需求描述如下:对数据库中查询出来的数据的某一个字段做一个简单处理。处理方式是:如果该字段的值(取值范围0~4,有可能为null)等于0,那么默认处理成1。

测试代码如下:

1 public classTestNull {2

3 privateInteger starLevel;4

5 publicInteger getStarLevel() {6 returnstarLevel;7 }8

9 public voidsetStarLevel(Integer starLevel) {10 this.starLevel =starLevel;11 }12

13 public static voidmain(String[] args) {14 TestNull test = newTestNull();15

16 Integer localStartLevel =

17 test.getStarLevel() != null && test.getStarLevel() == 0 ? 1: test.getStarLevel();18

19 System.out.println(localStartLevel);20 }21

22 }

因为不想写if-else,所以直接使用了三目运算符,原因嘛肯定是方便、简洁呀。一切都大功告成了,感觉自己棒棒哒!!!然后开始自测(发现代码没什么问题的童鞋不妨copy一下上面的代码执行一下),报错了!!!空!指!针!

b1d55f42d561bf7bedbff246149c439a.png

老实说,当时我撸这段代码很自信,我调试这段代码也看了三遍才找到原因。如果你也没找到原因,你可以把那个1换成Integer.valueOf(1)或者将分号后面的test.getStarLevel()

直接换成null(当然这样是不符合需求的)再试试。

问题原因:可能你也发现问题所在了,就是因为那个“方便、简洁”的三目运算符表达式

分析原因:

1、test.getStarLevel() != null && test.getStarLevel() == 0 ? 1 : test.getStarLevel()

结论:错误!因为有个分支是返回基本类型数值1,另一个分支返回的直接是对象的调用值(该值的类型在运行时动态确定的),所以,三目运算符帮我们统一处理成了基本类型装箱操作。所以null装箱肯定空指针。

2、test.getStarLevel() != null && test.getStarLevel() == 0 ? Integer.valueOf(1): test.getStarLevel();

结论:正确!因为基本类型1已经被初始化为Integer对象了,然后这个赋值表达式都是直接赋值引用了,所以不会存在问题。

3、test.getStarLevel() != null && test.getStarLevel() == 0 ? 1 : null

结论:正确!该段跟第一段代码的唯一区别就是test.getStarLevel()换成了null,这就消灭了运行时动态确定该分支的返回值类型的不确定性,所以能够正确执行。

三目运算符固然是好用,但是使用时还是需要注意返回值类型的统一性呀!且用且珍惜!

该博客仅代表个人观点,如有不足之处,请不吝惜指教!!!

Thanks!!!

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/11495.html

(0)
上一篇 2024-03-22 16:26
下一篇 2024-03-22 20:33

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信