最近在处理一个需求,需求描述如下:对数据库中查询出来的数据的某一个字段做一个简单处理。处理方式是:如果该字段的值(取值范围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一下上面的代码执行一下),报错了!!!空!指!针!

老实说,当时我撸这段代码很自信,我调试这段代码也看了三遍才找到原因。如果你也没找到原因,你可以把那个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!!!

三目表达式 java_Java 三目运算符表达式的一些问题相关推荐

  1. freeMaker 三目(三元)表达式

    第一次在freemaker中用三元表达式  以为和js 的一样 就写了 ${true ? 'checked': ''} 然鹅 ,编辑器红下划线报错,后台报错. 编辑器报错是   identifier ...

  2. lambda表达式java_Java Lambda表达式

    lambda表达式java Java lambda expression can be considered as one of the coolest feature introduced in J ...

  3. 【笔记】Java的运算符(赋值运算符号、一元运算符、算术运算符、关系运算符、自增与自减运算符、逻辑运算符、括号运算符、位运算符、三元(三目)运算符)、表达式与语句:简洁表达式

    文章目录 一.运算符 1.赋值运算符号 2.一元运算符 3.算术运算符 4.关系运算符 5.自增与自减运算符 6.逻辑运算符 7.括号运算符 8.位运算符 左移位: 右移位: 9.三元(三目)运算符 ...

  4. java里什么是三目表达式_浅谈Java三目运算

    三目条件运算公式为 x?y:z  其中x的运算结果为boolean类型,先计算x的值,若为true,则整个三目运算的结果为表达式y的值,否则整个运算结果为表达式z的值 例:String s=" ...

  5. Java 三目表达式中的NullPointerException问题

    Java 三目表达式中的NullPointerException问题 背景 问题 思考 找资料 反思 背景 旧系统改造. 问题 Integer rank = bpo.getLocalRank() != ...

  6. Vue中绑定值与字符串拼接以及结合三目表达式实现是否为空判定的使用

    场景 若依前后端分离版手把手教你本地搭建环境并运行项目: 若依前后端分离版手把手教你本地搭建环境并运行项目_BADAO_LIUMANG_QIZHI的博客-CSDN博客_若依前后端分离搭建 Vue中在调 ...

  7. java三目表达式_Java8新特性Lambda表达式

    1 Lambda表达式 对于很多计算机语言来说,Lambda表达式并不是陌生的语法格式,而对于Java而言,它的到来比较晚,直到Java8更新之后,Lambda表达式才正式出现在Java语法中.所以如 ...

  8. 三目表达式如何省略一个表达式

    三目表达式若想省略一个表达式, 可以用 null 代替 举例: public class HelloWorld {public static void main(String[] args) {// ...

  9. Vue使用v-for与v-if搭配满足条件进行赋值,和v-if三目表达式的使用

    Vue使用v-for遍历的时候,通过{{}}进行赋值 {{user.companyName = item.companyName}} <select class="form-contr ...

  10. Python 中的三元运算符,三目表达式

    三元运算符通常在Python里被称为条件表达式,这些表达式基于真(true)/假(false)的条件判断,在Python 2.4以上才有了三元操作. 下面是一个伪代码和例子: 伪代码: Python ...

最新文章

  1. CentOS Samba 服务器的构建(转)
  2. Spring AOP进行日志记录,管理
  3. 为什么计算机硬盘要从c盘开始,电脑分区为何从C盘开始?英特尔科普
  4. JavaScript异步
  5. arm-linux-gcc:Command not found的问题
  6. 【译】C#9的候选功能
  7. php 递归求得目录大小
  8. 中国开源产品如何走向世界?
  9. (第一周)2018091-2 博客作业
  10. Win7 蓝牙耳机无法使用
  11. unity物理引擎介绍
  12. Stata进行logistic回归绘制列线图并做内部验证
  13. 【评测】牛血清白蛋白(BSA)篇
  14. python实现电子邮件编程
  15. 利用GitHub Actions每天自动从Pixiv爬虫日推图片并存放到仓库
  16. 使用NLTK对英文文章分句,避免缩略词标点符号干扰
  17. Process-wide API spying - an ultimate hack 摘要翻译(二)
  18. PG distinct与distinct on
  19. 智慧工地安全施工实时监测系统解决方案
  20. 计算机看到硬盘是空白状态,为你解决win7系统磁盘管理显示空白无法使用的处理方法...

热门文章

  1. 按键精灵文字识别插件_按键精灵课程学习目录
  2. LaTeX 中的数学字体
  3. java 提取视频缩略图_如何使用java提取视频缩略图或某一帧的图片
  4. 对比(5.1.48VS8.0.16)getConnection、isValid
  5. Windows操作系统----安全机制----Token
  6. python中requests设置代理服务器
  7. c语言作业汽车加速,C语言求车速
  8. python是一门_人人用Python 篇一:Python是一门人人可掌握的手艺
  9. ios打包发布testflight
  10. 医院预约挂号小程序 开题报告(基于微信小程序毕业设计题目选题课题)