我的开发问题记录里有这么一个问题,当时项目着急就没用三目,也没查找原因,那时的bean.getCounter()返回值也不知道是啥了,没有关系,咱们彻底分析一下这个问题。

// 三目失效
String counter = bean.getCounter() == "1" ? "第一次" : "第二次";

1.认识三目运算符

三目运算符,官方英文名称:Conditional Operator ? : 中文直译条件表达式。三目运算符的基本用法非常简单,它由三个操作数的运算符构成,形式为:

<表达式 1>?<表达式 2>:<表达式 3>
  • 三目运算符从左往右计算,首先计算表达式 1 ,其结果类型必须为 Boolean 或 boolean,否则发生编译错误。
  • 当表达式 1 的结果为 true,将会执行表达式 2,否则将会执行表达式 3。
  • 表达式 2 与表达式 3 最后的类型必须得有返回结果,即不能为是 void,若为 void ,编译时将会报错。
  • 最后需要注意的是,表达式 2 与表达式 3 不会被同时执行,两者只有一个会被执行。

2.三目运算符使用规范

以下是阿里巴巴Java开发手册泰山版对三目使用规范的描述:

第一种情况:
三目运算符表达式发生自动拆箱,官方在 「The Java Language Specification(简称:JLS)」15.25 节[1]中做出一些规定,部分内容如下:

# JDK7 规范
If the second and third operands have the same type (which may be the null type),
then that is the type of the conditional expression.
If one of the second and third operands is of primitive type T,
and the type of the other is the result of applying boxing conversion (§5.1.7) to T,
then the type of the conditional expression is T.

翻译一下:如果表达式 2 与表达式 3 类型相同,那么这个不用任何转换,三目运算符表达式结果当然与表达式 2,3 类型一致。当表达 2 或表达式 3 其中任一一个是基本数据类型,比如 int,而另一个表达式类型为包装类型,比如 Integer,那么三目运算符表达式结果类型将会为基本数据类型,即int。

第二种情况:

Otherwise, binary numeric promotion (§5.6.2[2]) is applied to the operand types,
and the type of the conditional expression is the promoted type of the second and third operands.
Note that binary numeric promotion performs value set conversion (§5.1.13[3]) and may perform unboxing conversion (§5.1.8[4]).

翻译一下:当表达式 2 与表达式 3 类型不一致,但是都为数字类型时,低范围类型将会自动转为高范围数据类型,即向上转型。这个过程将会发生自动拆箱。

3.三目失效问题分析

为了写这篇文章,我敲了多个demo反复测试,想要复现当时的问题,各种尝试最终都失败了,我猜测当时出现失效现象的可能原因是表达式1,测试的时候我也是在表达式1上反复做文章,发现做不出文章来(掩面泪目)。

4.总结

三目看似简单,还是有坑的,就像运算符的短路机制,不知道的时候都是泪。

【Java后端】三目运算符失效问题刨根问底(及NPE分析)相关推荐

  1. Java后端以及web前端及echarts框架词云分析

    运用Java后端以及web前端及echarts框架词云分析做出数据分析统计可视化展示. 以下为我的项目展示截图: 开发环境: 集成开发环境(IDE):IntelliJ IDEA 2021 服务器:To ...

  2. 面试Java后端开发的感受:如果就以平时项目经验来面试,通过估计很难——再论面试前的准备...

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:hsm_computer 链接:https://www.cn ...

  3. 最近面试Java后端开发的感受

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:cnblogs.com/JavaArchitect/p/10 ...

  4. 最近面试 Java 后端开发的感受!

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 首发:cnblogs.com/JavaArchitect/p/10011253.html 上周,密 ...

  5. 面试java后端开发之后的一些感受

    在上周,密集面试了若干位Java后端的候选人,工作经验在3到5年间.我的标准其实不复杂:第一能干活,第二Java基础要好,第三最好熟悉些分布式框架,我相信其它公司招初级开发时,应该也照着这个标准来面的 ...

  6. Java后端架构开荒实战(二)——单机到集群

    Java后端架构开荒实战(二)--单机到集群 一.前言 上一篇文章做了一些准备工作,这边文章正式开始写代码. 在做好单实例架构之后,升级到集群是一件很容易的事情,所以把单机和集群放在这一篇一起说. 二 ...

  7. 三年半Java后端面试经历

    转载自  三年半Java后端面试经历 经过半年的沉淀,加上对MySQL,redis和分布式这块的补齐,终于开始重拾面试信心,再次出征. 鹅厂 面试职位:go后端开发工程师,接受从Java转语言 都知道 ...

  8. 我密集面试了若干位Java后端的候选人,给广大程序员的一点建议

    摘要 在上周,我密集面试了若干位Java后端的候选人,工作经验在3到5年间.我的标准其实不复杂: 第一能干活: 第二Java基础要好: 第三最好熟悉些分布式框架. 我相信其它公司招初级开发时,应该也照 ...

  9. java行转列_最近面试 Java 后端开发的感受!

    首发:cnblogs.com/JavaArchitect/p/10011253.html 上周,密集面试了若干位Java后端候选人,工作经验在3到5年间.我的标准其实不复杂(适用90%小小小公司,BA ...

最新文章

  1. CVPR2020 | 真实场景中的玻璃检测,有趣的应用
  2. 数据中心水冷系统备品备件管理新思路
  3. asp.net 网站开发流程总结
  4. 如何给SAP Cloud Connector Region列表中添加新的Region
  5. 今晚直播丨2020年全国首场12c OCM直考揭秘
  6. python画中秋的月亮_水彩中秋月亮教程
  7. python桌面程序打开慢_转 : 终于搞清楚了为什么Java桌面程序总是感觉慢的原因...
  8. No module named 'django.core.urlresolvers
  9. Win10文件夹大小分析、磁盘空间清理工具
  10. [SCOI2005]互不侵犯 (状压$dp$)
  11. android开源系统brvah,Brvah——一个强大的Adapter框架
  12. 每天30分钟学python-每天 3 分钟,小闫带你学 Python(二十三)
  13. 常用Cocoa框架概览
  14. 利用python批量创建.xsh文件实现Xshell批量登录服务器
  15. 【数字图像处理matlab】(HSI变换融合算法)
  16. 右键 git找不到应用程序
  17. 八、服务器【Ubuntu】GPU-TeslaP100部署
  18. 【计算机科学基础】Unicode与UTF-8
  19. Format_String_Attack_Lab
  20. 一起talk C栗子吧(第一百九十六回:C语言实例--DIY less命令五 )

热门文章

  1. Linux入门(6)——Ubuntu16.04安装atom
  2. java消息推送与接收
  3. Redis学习笔记1-安装配置
  4. nchar,char,varchar与nvarchar区别
  5. java佳沃维洛奇,新品速递:JAVA 双雄耀世登场
  6. MATLAB语言算法实验报告,机械工程实验——matlab实验报告.doc
  7. mysql variables 大记录 查询 慢_MySQL - 慢查询
  8. 在WPS中提取出的照片在哪找_WPS技巧 | 找不到合适的配图?教你一招搞定
  9. CSS设置文本字体居中
  10. nginx无法访问index.html,ThinkPHP5 + nginx配置(index.php无法访问404)